Javascript AngularJs:从另一个指令中的指令调用contoller方法

Javascript AngularJs:从另一个指令中的指令调用contoller方法,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我有一个指令在另一个指令里面。外部指令与控制器共享其作用域,而内部指令有自己的作用域。我想把控制器函数的引用传递给内部指令,这样就可以从那里调用它。但是我不知道如何将函数及其参数传递给内部指令,以便它能够正确调用控制器的函数 下面是我的问题 如果您单击“Dir 2 click me”,警报会显示参数未定义。只需将控制器置于作用域上:$scope.$b=this 请参阅:只需将控制器放在作用域上:$scope.$b=this 请参阅:您可以使用'='传入外部控制器方法,并相应地调整代码 angul

我有一个指令在另一个指令里面。外部指令与控制器共享其作用域,而内部指令有自己的作用域。我想把控制器函数的引用传递给内部指令,这样就可以从那里调用它。但是我不知道如何将函数及其参数传递给内部指令,以便它能够正确调用控制器的函数

下面是我的问题


如果您单击“Dir 2 click me”,警报会显示参数未定义。

只需将控制器置于作用域上:
$scope.$b=this


请参阅:

只需将控制器放在作用域上:
$scope.$b=this


请参阅:

您可以使用
'='
传入外部控制器方法,并相应地调整代码

angular.module('app', [])
    .controller('ctrl', function($scope){
        $scope.myCtrlMethod = function(msg, b) {
            alert(msg + ' and b='+b);
        };
    })
    .directive('dir1', [function(){
        return {
            restrict: 'E',
            replace: true,
            template: '<div><p ng-click="myDir1Method(\'my dir1 method\',\'b\')">Dir 1 Click me</p><dir2 my-ctrl-method="myCtrlMethod"></dir2></div>',
            link: function(scope, elem, attrs){
                scope.myDir1Method = function(msg,b){
                    scope.myCtrlMethod(msg, b);
                };
            }
        };
    }])
    .directive('dir2', [function(){
        return {
            restrict: 'E',
            scope: {
                myCtrlMethod: '='
            },
            replace: true,
            template: '<p ng-click="myDir2Method(\'my dir2 method\',\'b\')">Dir 2 Click me</p>',
            link: function(scope, elem, attrs){
                scope.myDir2Method = function(msg,b){
                    scope.myCtrlMethod(msg, b);
                };
            }
        };
    }]);
angular.module('app',[])
.controller('ctrl',函数($scope){
$scope.myCtrlMethod=函数(msg,b){
警报(消息+'和b='+b);
};
})
.directive('dir1',[function(){
返回{
限制:'E',
替换:正确,
模板:“

dir1单击我

”, 链接:功能(范围、要素、属性){ scope.myDir1Method=函数(msg,b){ 范围:myCtrlMethod(msg,b); }; } }; }]) .directive('dir2',[function(){ 返回{ 限制:'E', 范围:{ myCtrlMethod:“=” }, 替换:正确, 模板:“

dir2 click me

”, 链接:功能(范围、要素、属性){ scope.myDir2Method=函数(msg,b){ 范围:myCtrlMethod(msg,b); }; } }; }]);
普朗克:


编辑:
“=”
在父作用域的上下文中计算表达式,其结果绑定到内部作用域上的属性。在本例中,“myCtrlMethod”根据父范围进行计算,父范围从父范围(函数)返回
myCtrlMethod
。此函数绑定到内部作用域上的
myCtrlMethod
,可以使用
作用域调用。myCtrlMethod(msg,b)
您可以使用
'='
传入外部控制器方法,并相应地调整代码

angular.module('app', [])
    .controller('ctrl', function($scope){
        $scope.myCtrlMethod = function(msg, b) {
            alert(msg + ' and b='+b);
        };
    })
    .directive('dir1', [function(){
        return {
            restrict: 'E',
            replace: true,
            template: '<div><p ng-click="myDir1Method(\'my dir1 method\',\'b\')">Dir 1 Click me</p><dir2 my-ctrl-method="myCtrlMethod"></dir2></div>',
            link: function(scope, elem, attrs){
                scope.myDir1Method = function(msg,b){
                    scope.myCtrlMethod(msg, b);
                };
            }
        };
    }])
    .directive('dir2', [function(){
        return {
            restrict: 'E',
            scope: {
                myCtrlMethod: '='
            },
            replace: true,
            template: '<p ng-click="myDir2Method(\'my dir2 method\',\'b\')">Dir 2 Click me</p>',
            link: function(scope, elem, attrs){
                scope.myDir2Method = function(msg,b){
                    scope.myCtrlMethod(msg, b);
                };
            }
        };
    }]);
angular.module('app',[])
.controller('ctrl',函数($scope){
$scope.myCtrlMethod=函数(msg,b){
警报(消息+'和b='+b);
};
})
.directive('dir1',[function(){
返回{
限制:'E',
替换:正确,
模板:“

dir1单击我

”, 链接:功能(范围、要素、属性){ scope.myDir1Method=函数(msg,b){ 范围:myCtrlMethod(msg,b); }; } }; }]) .directive('dir2',[function(){ 返回{ 限制:'E', 范围:{ myCtrlMethod:“=” }, 替换:正确, 模板:“

dir2 click me

”, 链接:功能(范围、要素、属性){ scope.myDir2Method=函数(msg,b){ 范围:myCtrlMethod(msg,b); }; } }; }]);
普朗克:


编辑:
“=”
在父作用域的上下文中计算表达式,其结果绑定到内部作用域上的属性。在本例中,“myCtrlMethod”根据父范围进行计算,父范围从父范围(函数)返回
myCtrlMethod
。此函数绑定到内部作用域上的
myCtrlMethod
,可以使用
scope调用。myCtrlMethod(msg,b)
您可以使用控制器作为指令的参考

见:

指令('sonDirective',函数(){ 返回{ 限制:“E” 作用域:{}, 替换:正确,
模板:'您可以使用控制器作为指令的引用

见:

指令('sonDirective',函数(){ 返回{ 限制:“E” 作用域:{}, 替换:正确,
模板:“它似乎对我不起作用。当我单击“目录2单击我”时,它仍然显示未定义的msg参数。它似乎对我不起作用。当我单击“目录2单击我”时”它仍然将msg参数显示为未定义。它确实有效,非常感谢!但我认为“=”用于绑定到外部作用域的属性。您能给出一个简短的解释或提供一个链接吗?没问题…绑定变量的不同方法确实令人困惑。更新了解释。它确实有效,谢谢y太多了!但我认为“=”用于绑定到外部作用域的属性。你能给出一个简短的解释或提供一个链接吗?没问题……绑定变量的不同方法确实令人困惑。用解释更新了。你的示例工作得很好。但是当我修改jsbin以匹配我的示例时,它就停止工作了g、 试一试:,问题是,它不是一个全局函数,而是控制器作用域下的键。使用$scope.yourMethod,或者使用Ctrl作为Ctrl并从DOMIt的另一种方法获得访问权限来解决我的问题。不幸的是,我不能有两个可接受的答案,而第一个更适合我。无论如何,谢谢大家!您的示例非常有效e、 但是,当我修改jsbin以匹配我的示例时,它就停止工作了。请尝试以下操作:,问题是,它不是全局函数,而是控制器作用域下的键。请使用$scope.yourMethod,或者使用Ctrl作为Ctrl并从DOMIt的另一种方法获取访问权限来解决我的问题。不幸的是,我不能有两种方法