2016-09-24 146 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-如果您需要手動註銷吧)