2014-03-25 113 views
0

我在另一個指令中有一個指令。外部指令與控制器共享其範圍,而內部指令有自己的範圍。我想將控制器的函數引用傳遞給內部指令,以便可以從那裏調用它。但我不知道如何將函數及其參數傳遞給內部指令,以便它可以正確調用控制器的函數。AngularJs:從另一個指令中的指令調用控制器方法

這裏是planker來說明我的問題。

如果您點擊「Dir 2 Click me」,則警報顯示參數未定義。

回答

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

編輯:'='評估th e表達式在父範圍的上下文中,其結果綁定到內部範圍的屬性上。在這個例子中,'myCtrlMethod'是根據父作用域評估的,它從父作用域(一個函數)返回myCtrlMethod。該函數在內部範圍上綁定到myCtrlMethod,可以用scope.myCtrlMethod(msg, b)調用。

+0

它確實有用,非常感謝!但我認爲'='用於綁定到外部作用域的屬性。你可以給出一個簡短的解釋或提供一個爲什麼這個作品的鏈接? –

+0

沒問題...綁定變量的不同方法確實令人困惑。更新與解釋。 –

2

你可以使用控制器作爲參考,您的指令

參見:http://jsbin.com/vayij/1/edit

+0

你的例子工作正常。但是當我修改jsbin以匹配我的示例時,它停止工作。 http://jsbin.com/caxoheno/2/edit –

+0

試試這個:http://jsbin.com/caxoheno/3/edit, 問題是,它不是全局函數,它是你的控制器範圍內的關鍵。 使用$ scope.yourMethod,或使用Ctrl作爲Ctrl並從DOM獲取訪問權限 – a8m

+0

這是解決我的問題的另一種方法。不幸的是,我不能有兩個被接受的答案,第一個答案更適合我。無論如何感謝一堆! –

相關問題