AngularJs:从另一个指令内的指令调用控制器方法

时间:2014-03-25 04:12:42

标签: javascript angularjs angularjs-directive angularjs-scope

我在另一个指令中有一个指令。外部指令与控制器共享其范围,而内部指令具有自己的范围。我想将对控制器函数的引用传递给内部指令,以便可以从那里调用它。但我无法弄清楚如何将函数及其参数传递给内部指令,以便正确调用控制器的函数。

以下是planker来说明我的问题。

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

3 个答案:

答案 0 :(得分:3)

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

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

Plunker:http://plnkr.co/edit/xbSNXaSmzWa3G1GSH6Af?p=preview

编辑:'='计算父作用域上下文中的表达式,其结果绑定到内部作用域上的属性。在此示例中,将针对父作用域计算“myCtrlMethod”,父作用域从父作用域(函数)返回myCtrlMethod。此函数绑定到内部作用域上的myCtrlMethod,可以使用scope.myCtrlMethod(msg, b)调用。

答案 1 :(得分:2)

您可以使用控制器作为指令的参考

请参阅:http://jsbin.com/vayij/1/edit

directive('sonDirective', function(){
  return {
         restrict: 'E'
         scope: {},
         replace: true,
         template: '<div....'
         controller: 'MainController' //controller as a reference 
      }
})

答案 2 :(得分:0)

只需将控制器放在范围内:$scope.$b=this;

请参阅:http://plnkr.co/edit/skDF8D1scFJYrTUmcXIL?p=preview