[英]AngularJS parent directive communicate with child directive
考慮兩個帶有隔離范圍的嵌套指令:
<dctv1>
<dctv2></dctv2>
<dctv1>
如果我想dctv2
談dctv1
我有可能會選擇:
dctv1
中的定義dctv2
使用require:'^dctv1'
<dctv2 callParent="hello()"></dctv2>
和scope:{callParent:'&'}
調用父作用域上的表達式scope:{callParent:'&'}
dctv2
使用$scope.$emit
,但是所有父作用域都會聽到消息。 現在我想dctv1
交談dctv2
。
$scope.$broadcast
,但隨后所有孩子都會聽到。 通過這里談話,我的意思是稱為函數或類似函數。 不想設置堵塞digestloop的手表。
如何讓dctv1
以最佳方式通知dctv2
,使它們松散耦合? 我應該能夠刪除dctv2而不會出錯。
看看AngularJS NgModelController的一些想法。
每個<dctv2>
指令都需要<dvtv1>
來注入它的控制器。 然后,您可以將對象或回調添加到該控制器的屬性,並在<dctv2>
被銷毀時將其刪除。
<dvtv1>
不會直接與孩子交談,但會觸發綁定到其屬性的回調。
例如;
NgModelController
有$parsers
和$formatters
,它們是函數回調數組。 您將自己的函數推送到數組中以擴展該控制器的行為。
當NgModelController
執行輸入驗證時,它基本上通過這些屬性與其他指令對話。
我建議使用角度服務 。 這樣,您就可以將行為分離為一個或多個服務。
看看這個: AngularJS:如何觀察服務變量?
一種方法是建立一個服務/工廠,與您想要的控制器進行通信。
例如,這是一個getter / setter工廠
.factory('factoryName', function () {
var something = "Hello";
return {
get: function () {
return something;
},
set: function (keyword) {
something = keyword;
return something ;
}
};
}])
然后在你的控制器中:
.controller('controllerOne', ['factoryName', function (factoryName) {
$scope.test = factoryName.get();
}]);
.controller('controllerTwo', ['factoryName', function (factoryName) {
$scope.test = factoryName.get();
$scope.clickThis = function (keyword) {
factoryName.set(keyword);
};
}]);
我建議閱讀: 一個控制器可以調用另一個嗎?
您可以使用必須傳遞給父級的每個子級的id來管理它; 父節點將使用該id廣播事件:只有從父節點傳遞的id是他自己的id時,子節點才會執行操作。
再見
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.