2013-07-22 68 views
2

我在互聯網上搜索了所有內容,找不到解決方案,請幫忙!如何從控制器調用指令範圍的函數

directive('menu',function(){ 
    return{ 
     link : function(scope,element,attrs){ 
      scope.foo = function(){ 
      alert('test!'); 
      } 
     }, 
     controller : function($scope){ 
      $scope.foo(); 
     } 
    } 
}); 
+2

你在這裏的''link'函數是'後鏈接'函數;然而,控制器在* pre-linking階段之前被實例化,所以'$ scope.foo'不可用。 –

回答

3

延遲使用$evalAsync()調用foo()

controller : function($scope){ 
    $scope.$evalAsync(function() { 
     $scope.foo(); 
     console.log($scope); 
    }); 
} 

fiddle

你也可以使用$timeout()代替$evalAsync()。兩者都允許首先執行鏈接功能。

+0

非常感謝m8!這工作完美!只是爲了澄清我這樣做,這是因爲我正在與一個菜單切換指令插件,它綁定點擊內的指令..我不希望它做到這一點,我希望它是刷卡而不是點擊並在通過Phonegap爲移動應用程序激活hm-swipe =「menu()」時激活它。 – TheNickyYo

1

至於劉燁說,你的控制器調用你的指令的編譯,然後鏈接功能。 從角指令DOC(http://docs.angularjs.org/guide/directive):

控制器的聯前階段

控制器將是您的應用的範圍內,並且之前實例化一次的鏈路後功能完成後,您的指令將成爲此範圍的子項。考慮到鏈接函數的目的是將模型數據綁定到您的模板併爲綁定變量設置手錶,而不是創建謹慎的「指令對象」。

如果您嘗試在鏈接函數內部設置foo函數以訪問指令作用域變量,請查看指令委託函數和「scope:」指令屬性中的綁定變量。角度指令教程給出了一個稍微鈍的版本作爲它的最後一個例子(「zippy」),Angularjs Directive Delegate not firing through intermediary handler給出了一個可以從模板本身調用的委託函數的例子。

+0

OP寫入指令的方式沒有新的子作用域。查看我的答案/小提琴 - 展開指令控制器記錄的$ scope,您將看到該指令不會創建新的作用域 - 它與MyCtrl的作用域相同。 –

+0

@MarkRajcok嗯 - 我想我的問題真的比技術可能性更有意思。正如你所說,不使用「範圍」屬性,鏈接和控制器共享一個範圍(及其所有組件) - 那麼爲什麼不在控制器中設置功能並避免異步調用呢? – MaxPRafferty

+1

在控制器中設置功能將是解決此問題的好方法(並且我會建議這種方法勝過我在答案中提供的方法)。但是,我不確定OP是否需要按照出於某種原因顯示的方式來執行它。 –

相關問題