2013-02-13 36 views
2

我有幾個指令需要在完成他們的事情後調用相同的函數。該功能需要訪問主控制器範圍,但也需要修改DOM。應該如何以及在哪裏宣佈這個功能?角度可重用函數

+0

是否所有指令都放在主控制器範圍之下?換句話說,所有在定義主控制器的元素(即'

...
')內實現那些指令的DOM元素? – bmleite 2013-02-13 15:17:09

+0

@bmleite - 是的,他們是。 – supermasher 2013-02-15 15:22:41

回答

7

您應該使用服務,服務可以訪問$rootScope,但是在指令級別保留DOM修改會更好,在某些情況下您可以使用它。

angular.module("myModule", []) 
.factory("MyService", function ($rootScope) { 
    return { 
     myFunction: function() { // do stuff here } 
    } 
}) 
.directive("MyDirective", function (MyService) { 
    return { 
     link: function (scope, iElement, iAttrs) { 
      // try do keep dom modification here, you have access to MyService, 
      // let it do the algorithm and try to keep dom modification here. 
      // PS: you can also inject $rootScope to directives. 
     }; 
    }; 
}); 
+0

+1爲解決方案和示例。很明顯看到我的可重用函數如何在服務中聲明,然後可以傳遞給需要訪問它們的指令。感謝fastreload! – supermasher 2013-02-14 11:06:13

-1

如果此功能需要訪問控制的範圍,我會用這是在指令訪問的範圍,並把它作爲PARAM,就像這樣:

var MyDirective = function() { 
    var linkFn = function(scope, element, attrs) { 
     callAwesomeFn(scope); 
    }; 

    return { 
     link: linkFn 
    } 
}; 

現在,把它放在哪裏?

  • 如果這是效用函數,我會放一些公用事業命名空間,就像MyFunctions.callAwesomeFn()
  • ,如果這是一個需要與角管理的其他對象進行交互的組件 - 使用依賴注入,注入指令
+0

感謝Lukasz,把範圍傳遞給一個實用函數正是我所做的,雖然它感覺有點髒,通過角度以外的範圍來實現我的目標。我的可重用函數調用另外兩個函數;一個修改DOM,另一個調用控制器功能。我不確定您的第二個建議(DI)是否適合此目的? – supermasher 2013-02-13 14:38:51