Javascript 如何从子指令调用父指令链接函数';s链接函数
我有两个指令,Javascript 如何从子指令调用父指令链接函数';s链接函数,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我有两个指令,directiveA和directiveB都具有link功能。如何从directiveB调用属于directiveA的函数 到目前为止,我设置代码的方式是: angular.module('myApp').directive('directiveA', function () { return { templateUrl: 'directiveA.html', link: function (scope) { scop
directiveA
和directiveB
都具有link
功能。如何从directiveB
调用属于directiveA
的函数
到目前为止,我设置代码的方式是:
angular.module('myApp').directive('directiveA', function () {
return {
templateUrl: 'directiveA.html',
link: function (scope) {
scope.directiveAAlert = function () {
alert('This is A');
}
}
}
});
angular.module('myApp').directive('directiveB', function () {
return {
scope: {
onButtonClicked: '='
}
templateUrl: 'directiveB.html',
link: function (scope) {
scope.showAlert = function () {
scope.onButtonClicked();
}
}
}
});
在directiveA.html
中:
<directive-b onButtonClicked='directiveAAlert'></directive-b>
<button ng-click='showAlert()'></button>
但当我单击按钮时,会出现一个错误,提示TypeError:scope.onLogInButtonClicked不是scope.link.scope.showart的函数
如何从子指令定义和调用同一个函数?您需要使用指令的require
选项,您可以提到另一个指令将位于同一元素上,或者它可能是我的父指令,在指令API中使用require
属性。使用require:^parentDirective
时,您可以在链接函数childDirective
中访问需要它的parentDirective
控制器
此外,您还需要更正模板html,该模板的属性应为-
,通过替换其cammelcase分隔
directiveA.html:
<directive-b on-button-clicked='directiveAAlert()'></directive-b>
为什么要将directiveAAlert
迁移到控制器?我只需在单击按钮时将属性从camel case更改为,它就解决了我的问题。(我不需要创建一个控制器并要求它在子对象中运行)@roscioli哦..这是有效的,因为你在隔离范围内传递了该方法..如果你在隔离范围内没有传递该方法,那么你可以直接调用父指令方法而不在隔离范围内传递它。。
<button ng-click='showAlert()'></button>
angular.module('myApp').directive('directiveA', function () {
return {
templateUrl: 'directiveA.html',
link: function (scope) {
//code here
},
controller: function($scope){
scope.directiveAAlert = function () {
alert('This is A');
}
}
}
});
angular.module('myApp').directive('directiveB', function () {
return {
scope: {
onButtonClicked: '='
},
require: '^directiveA',
templateUrl: 'directiveB.html',
link: function (scope,element,attrs, ctrl) {
scope.showAlert = function () {
ctrl.onButtonClicked(); //ctrl has access to the directive a controller.
}
}
}
});