2014-12-31 96 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