gpt4 book ai didi

angularjs - $emit 与父子指令通信中的回调最佳方法

转载 作者:行者123 更新时间:2023-12-04 02:26:11 27 4
gpt4 key购买 nike

我试图了解在具有隔离作用域(它们可能是可重用项目)的父和子指令之间进行通信的最佳通用方法是什么。

意思是如果子指令需要以某种方式更新父指令(两者都有独立的范围),
我是不是该
传递回调函数:

例如:

.directive('filterReviewStepBox', function () {
return {
restrict: 'EA',
scop: {
//some data
},
template: '<div>text<reusable-dir></reusable-dir call-back="foo"></div>',
link: function (scope, elem, attrs) {
scope.foo = function () {
console.log('bar');
};
}
};
}).directive('reusableDir', function () {
return {
restrict: 'EA',
scope: {
callBack: '=callBack'
//other data
},
template: '<div>text<button type="button" ng-click="bar"></button></div>',
link: function (scope, elem, attrs) {
scope.bar = function () {
scope.callBack();
}
}
};
});

或者我应该使用 $emit():

例如:
  directive('filterReviewStepBox', function () {
return {
restrict: 'EA',
scope: {
// some data
},
template: '<div>text<reusable-dir></reusable-dir></div>',
link: function (scope, elem, attrs) {
scope.$on('foo', function () {
console.log('bar');
});
}
};
}).directive('reusableDir', function () {
return {
restrict: 'EA',
scope: { //some data
},
template: '<div>text<button type="button" ng-click="bar"></button></div>',
link: function (scope, elem, attrs) {
scope.bar = function () {
scope.$emit('foo');
};
}
};
});

我觉得在更大的范围内,emit 会更容易理解,但担心性能和开销,但我仍然不确定

试图在网上寻找最好的方法,但我仍然跺着脚

编辑

我忘记了

require



选项。
但我仍然不确定这是最正确的解决方案。
由于这不允许我重用子项或孙项,并且使指令成为单一用途的项目。

最佳答案

为此,最好使用“require”属性。

指令的完整指南告诉我们有关 require 属性的信息:https://docs.angularjs.org/api/ng/service/ $编译

Require another directive and inject its controller as the fourth argument to the linking function. The require takes a string name (or array of strings) of the directive(s) to pass in.



Require 只是告诉指令它应该寻找一些父指令并获取它的 Controller 。您可以使用 ^ 前缀告诉指令在父元素中进行搜索,并使用 ?字首。

我已经修改了您的示例,因此 reusableDir 可以调用 filterReviewStepBox Controller ,但也可以单独使用。

http://jsbin.com/gedaximeko/edit?html,js,console,output
angular.module('stackApp', [])  
.directive('filterReviewStepBox', function () {
return {
restrict: 'EA',
scope: {
// some data
},
template: '<div>text<reusable-dir></reusable-dir></div>',
link: function (scope, elem, attrs) {

},
controller : function() {
this.notify = function(value) {
console.log('Notified : ' + value);
};
},
controllerAs: 'vm',
bindToController: true
};
}).directive('reusableDir', function () {
return {
restrict: 'EA',
scope: { //some data
},
require: '?^filterReviewStepBox',
template: '<div>text<button type="button" ng-click="bar()"></button></div>',
link: function (scope, elem, attrs, controller) {
scope.bar = function () {
if (controller) {
controller.notify('foo');
}
};
}
};
});

关于angularjs - $emit 与父子指令通信中的回调最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33315969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com