2014-12-31 104 views
0

我遇到了一个看起来很容易编写的指令问题。根据我的理解,我的问题与评估表达式的范围有关。ngClick针对范围而不是针对范围进行评估

还有一个plunker演示。

我有一个控制器和一个指令,下面的JavaScript代码:

angular.module('parentGet', []) 
    .controller('Parent', function($scope) { 
    $scope.foo = function() { 
     alert('hello world'); 
    }; 
    }) 
    .directive('child', function() { 
    return { 
     restrict: 'A', 
     scope: { 
     fn: '&' 
     }, 
     link: function($scope) { 
     $scope.fn2 = function() { 
      $scope.fn(); 
     } 
     } 
    }; 
    }); 

此代码是从以下HTML使用

<body ng-controller="Parent"> 
    <div child fn="foo" ng-click="fn2()"> 
    <h1>Test</h1> 
    </div> 
</body> 

当我点击的股利,NG-的但是当我在angular.js文件(line 22949 of the 1.3.8 version)中设置断点时,我可以看到ng-click是针对父控制器作用域评估的,而不是针对子指令隔离作用域评估的。

任何建议,使该代码的工作?

编辑

更具体地讲这个问题我已经是,FN2没有被调用,这似乎在我的情况很奇怪。 ng-click试图再次评估fn2()表达式的控制器作用域,该作用域没有任何fn2函数,它导致角度取noop函数。

+0

是的,这是默认的行为。 –

+0

我已更新您编辑的问题的答案。 –

回答

0

这是默认行为。从角度文档:

当用户单击对话框中的x时,由于ng-click,调用该指令的关闭 函数。此调用在 隔离范围上关闭,实际上会评估原始范围的 上下文中的表达式hideDialog(),从而运行Controller的hideDialog 函数。

看到它,https://docs.angularjs.org/guide/directive

答到编辑的问题

事情你期待的是NG-点击会调用指令功能的fn2()将再次是不可能的。由于角度会再次用父控制器范围评估该函数调用。所以,你的代码改成这样:

.directive('child', function() { 
    return { 
     restrict: 'A', 
     scope: { 
     fn: '&' 
     }, 
     link: function($scope, element) { 
     element.on('click', $scope.fn2); 

     $scope.fn2 = function() { 
      $scope.fn(); 
     } 
     } 
    }; 
    }); 

,改变你的HTML片段到:

<body ng-controller="Parent"> 
    <div child fn="foo"> 
    <h1>Test</h1> 
    </div> 
</body> 
+0

我编辑了我以前的帖子,因为问题不在于所调用的函数是在错误的作用域中求值,而是因为在控制器作用域中没有fn2,所以fn2永远不会被求值。 – Pierrrrrrrot