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.
            }
        }
    }
});