從here複製。也許,我可以在這裏得到更正確的答案!指令之間溝通的最佳方式
指令之間似乎有很多方法進行通信。假設你有嵌套的指令,其中內部指令必須與外部通信(例如,它已被用戶選擇)。
<outer>
<inner></inner>
<inner></inner>
</outer>
到目前爲止,我有這樣
的5種方法要求:家長指導
內部指令可能要求外部指令,它可以暴露其控制器上的一些方法。所以在內部定義
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
而在外部指令的控制器:
controller: function($scope) {
this.chosen = function(something) {
}
}
$發出事件
內部指令可以$發出一個事件,其中外指令可以響應通過$ on。因此,在內部指令的控制器:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
並且在外指令控制器:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
執行在父範圍表達,經由&
項可以結合到在表達父範圍,並在適當的位置執行它。 HTML代碼將是這樣的:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
所以內部控制有一個「innerChoose」功能,它可以調用
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
這將調用(在這種情況下)在外部指令的的「functionOnOuter」功能範圍:在非隔離範圍
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
範圍繼承
鑑於這些是嵌套控制器,範圍繼承可以在工作,並且內部指令可以只調用範圍鏈中的任何函數,只要它沒有隔離範圍即可)。所以在內部指令:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
而在外部指令:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
通過服務注入到內外
服務可以被注入到兩個指令,這樣他們就可以可以直接訪問同一個對象,或者調用函數來通知服務,甚至可以在pub/sub系統中註冊自己以通知。這不需要指令被嵌套。
問:每個人的潛在缺點和優點是什麼?