2016-09-24 100 views
1

我是新来的角,搜索下面的一个很好的解决方案,但没有找到一个好的选择。
我有一个极其s mod的模式对话框,由ModalDialogCtrl控制,其中包含一个编辑的对象,如兔或狗或猫或其他任何东西。我希望在用户按下“保存”按钮时允许保存任何对象的相同功能。 Dialog的viewmodel有一个嵌套视图,用于编辑对象,其模板名称将根据编辑对象的类型进行替换。这个特定的视图包含对象特定的控制器。嵌套控制器之间的通信

模态控制器:

function ModalDialogCtrl($scope) { 
    // $scope.objectSpecificViewModelTemplate = "rabbit.html"; 
    // or 
    // $scope.objectSpecificViewModelTemplate = "dog.html"; 
    // etc 
    ctrl.save = function() { 
     // need to call inner object controller's save() method here 
    }; 

    ctrl.cancel = function() { 
     // cancel editing 
    }; 
}; 

模式对话框视图:

<div class="modal-header"> 
    <!-- Modal header --> 
</div> 
<div class="modal-body" id="modal-body"> 
    <!-- Modal body containing object-specific view model --> 
    <div ng-include src="objectSpecificViewModelTemplate"></div> 
</div> 
<div class="modal-footer"> 
    <!-- Modal buttons --> 
    <button class="btn btn-primary" type="button">OK</button> 
    <button class="btn btn-warning" type="button">Cancel</button> 
</div> 

特定于对象的视图模板:

<div ng-controller="RabbitCtrl"> 
    <p>Weight: <input type="text" ng-model="rabbit.weight" /></p> 
</div> 

<div ng-controller="DogCtrl"> 
    <p>Color: <input type="text" ng-model="dog.color" /></p> 
</div> 

特定对象控制器:

function RabbitCtrl($scope) { 
    $scope.rabbit = { weight: 5} 
    $scope.save = function() { /* save to server */ }; 
} 
function DogCtrl($scope) { 
    $scope.dog = { dog: "black"} 
    $scope.save = function() { /* save to server */ }; 
} 

我需要的是,当用户按下保存按钮来调用内部对象的save()方法。我希望模态控制器和对象特定的控制器解耦,因为我可能希望在应用程序的不同位置重用它们。所以我认为一般我的问题是这样的:如何让父控制器调用特定的嵌套控制器方法(可以有很多嵌套的控制器)或如何让内部控制器调用特定的父控制器方法?

+0

听起来像应该是动态控制器的指令。 [动态控制器的指令](http://stackoverflow.com/a/23647720/452708) – Abhijeet

+0

@Abhijeet我不希望把控制器变成指令只是为了实现这个目标。应该有一种不同的方式:)现在我正在考虑通过.emit()和.on()进行消息传递,但仍然没有错误的解决方案。 – LINQ2Vodka

回答

0

我看到太多的方式在这里:

  1. 使用事件。

  2. 使用要求。在子控制器,你需要家长和调用即:

parentCtrl.register(childCtrl)

现在parentCtrl你存储链接到子:

vm.register = function(child) { 
    vm.containedComponent = child; 
} 

,并可以调用它的任何方法。 (即的onSave)

(这并不坏,如果你确信你的父母总会有且只有一个孩子,但是如果孩子可能更改使用NG-如果您需要手动注销吧)