从这里复制。可能是,我可以在这里得到更正确的答案!
指令之间似乎有相当多的通信方式。假设您有嵌套指令,其中内部指令必须与外部通信(例如,它是由用户选择的)。
<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) {
}
}
$发射事件
内部指令可以 $emit 一个事件,外部指令可以通过 $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) {
}
}
通过服务注入内部和外部
可以将服务注入到这两个指令中,因此它们可以直接访问同一个对象,或者调用函数来通知服务,甚至可以在发布/订阅系统中注册自己以接收通知。这不需要嵌套指令。
问题:与其他人相比,每个人都有哪些潜在的缺点和优点?