2013-03-17 11 views
58

Mam kilka wtyczek i bibliotek, których chcę używać w mojej aplikacji kątowej i (obecnie) po prostu odwołuję się do tych funkcji/metod, jak to było zamierzone w 99% aplikacji w sposób całkowicie ignorujący iniekcję zależności.AngularJS - Wstrzyknięcie zależności w usługach, fabrykach, filtrach itp.

Mam (na przykład) bibliotekę javascript "MomentJS", która zajmuje się formatowaniem i sprawdzaniem poprawności dat i mam dla niej zastosowanie w całej mojej aplikacji w kontrolerach, usługach i filtrach. Sposób, w jaki się nauczyłem (używając AngularJS) polega na stworzeniu usługi odwołującej się do funkcji (i jej metod) i wstrzyknięciu tej usługi do moich kontrolerów, co działa świetnie.

Problem polega na tym, że naprawdę muszę odwoływać się do tej biblioteki we wszystkich rodzajach komponentów od usług do filtrów do kontrolerów i wszystkiego innego. Tak, myślę, że moje pytanie brzmi: jak zrobić zastrzyk zależności w filtrach, usługach i wszystkim, co nie jest kontrolerem?

Czy to możliwe? Czy to jest nawet korzystne?

Każda pomoc będzie bardzo mile widziane :)

Odpowiedz

100

Tak można użyć Dependency Injection dla filtrów i dyrektyw

Ex:

Filtr:

app.filter('<filter>', ['$http', function(http){ 
    return function(data){ 
    } 
}]); 

dyrektywa:

app.directive('<directive>', ['$http', function(http){ 
    return { 
     .... 
    } 
}]); 

Usługa:

app.factory('<service>', ['$http', function(http) { 
    var shinyNewServiceInstance; 
    return shinyNewServiceInstance; 
}]); 
+7

To jest dokładnie to, czego szukałem :) –

+1

Czy istnieje jakiś sposób, aby zginać składni wstrzyknąć współzależności do dostawcy? Potrzebuję: dostawcę, do którego mogę wstrzyknąć depot, lub fabryki/usługi, które mogę wprowadzić do bloku konfiguracyjnego (?) – Cody

+0

@ Usługi Codes i fabryki _do_ dostawców. Również '.config()' obsługuje iniekcję zależności w dokładnie taki sam sposób jak powyższe przykłady. –

21

Dla kompletności, tutaj jest przykład serwis z wtryskiem:

app.service('<service>', ['$http', function($http) { 
    this.foo = function() { ... } 
}]); 
+0

W tej chwili wydaje się, że nie mogę wprowadzić kontrolera do usługi - przynajmniej nie mojej własnej. Naprawdę nie powinienem tu być, ale nie widzę sposobu na to, by dyrektywa modalna działała poza kontrolerem, który pobudza ją do pojawienia się. Stworzyłem usługę, aby spróbować i wykonać dwustronną komunikację, myśląc, że usługa może wstrzyknąć obu kontrolerów, ale niestety .. jaki byłby najlepszy sposób, aby to osiągnąć. Chciałbym zadać tutaj pytania, ale z jakiegoś powodu wydaje się, że są zablokowane, więc mogę tylko komentować podobne rzeczy. – landed

+0

Naprawdę musisz zadać pytanie, najlepiej za pomocą [plnkr.co] (http://plnkr.co/) swojego kodu. – user1338062

+0

Chciałbym móc pisać pytania - wydaje się, że ta strona, gdy zostaniesz zablokowany, zadając zbyt wiele, że blokuje cię na zawsze. W skrócie myślę, że nie można wstrzykiwać kontrolerów do rzeczy (co tak czy owak brzmi głupio) Tak więc stworzyłem program ustawiający usługi i pobierające, a następnie obserwuję to dla zmian w kontrolerach, które muszą zasubskrybować aktualizacje. To zadziałało i pozwoliło mi na kontroler do combo kontrolera. – landed

5

Choć już istniejące odpowiedzi są poprawne i pracy, John Papas kątowe przewodnik styl preferuje stosowanie usługi $inject w Y091:

Filtr:

app.filter('<filter', MyFilter); 
MyFilter.$inject = ['$http']; 
function MyFilter() { 
    return function(data) { 
    } 
} 

dyrektywa:

app.directive('<directive>', MyDirective); 
MyDirective.$inject = ['$http']; 
function MyDirective() { 
    return { 
    ... 
    } 
} 

fabryczne:

app.factory('<factory>', MyFactory); 
MyFactory.$inject = ['$http']; 
function MyFactory() { 
    var shinyNewServiceInstance; 
    return shinyNewServiceInstance; 
} 

Usługa:

app.service('<service>', MyService); 
MyService.$inject = ['$http']; 
function MyService() { 
    this.foo = foo; 
    function foo(){ 
    ... 
    } 
} 
Powiązane problemy