2013-10-04 15 views
31

Czy można to zrobić za pomocą metody dostawcy?Jak wstrzyknąć zależności do dostawcy za pomocą Angularjs?

W tym przykładzie

angular.module('greet',[]) 
.provider('greeter',function() { 

    this.$get=function() { 

    }; 
}) 
.service('greeterService',function($http){ 
    console.log($http); 
}) 
; 

Wstrzykiwanie $http do służby wydaje się być prawidłowa realizacja, ale to nie działa w sposób operatora i zgłasza błąd:

Unknown provider: $http

robi metoda dostawcy działa z DI do wstrzykiwania usług?

Odpowiedz

55

Z pewnością można podać $http dostawcy. Po prostu upewnij się, że pojawia się on w $get, a nie konstruktorze funkcji. W następujący sposób:

angular.module('greet',[]).provider('greeter',function() { 
    this.$get = function($http) { 

    }; 
}); 
+1

Dzięki. Czy to znaczy, że nie możemy używać $ http (lub innych usług) poza $ get? – Chung

+0

Nie, możesz użyć $ http wszędzie tam, gdzie można wstrzyknąć usługę. $ get to tylko jeden z nich. –

+1

i jak zminimalizować akceptację? –

2

Trzeba wstrzyknąć zależność od $ get, a następnie zapisać ją do wykorzystania na tym, co pobieracie z $ get. Wcale nie piękne ...

3

Nie, nie można wprowadzić usługi do samego usługodawcy. Wstrzyknięcie usługi do metody $ get dostawcy jest takie samo jak wstrzyknięcie usługi do fabryki, ale nie można jej bezpośrednio wprowadzić do funkcji dostawcy.

Różnica między wartością $ get a samym dostawcą polega na tym, że dostawca działa podczas module loading phase, podczas gdy $ get uruchamia się podczas tworzenia usługi, którą udostępniasz.

Oznacza to, że nie można w ogóle korzystać z żadnej usługi podczas fazy ładowania modułów/konfiguracji modułów. To wszystko, czego używasz w swoich blokach konfiguracyjnych, na przykład podczas definiowania tras lub stanów aplikacji, nie może korzystać z żadnej usługi.

Jedyną inną rzeczą, którą można wprowadzić do bloków konfiguracji oprócz dostawców są stałe.

Możesz zrobić coś takiego, jak sugerował IgrCndd. Ale jeśli potrzebowałbyś skonsumować dostawcę w bloku konfiguracyjnym, co jest celem dostawcy, nie będziesz miał swoich wartości wstrzykniętych aż za dużo później. Więc nie zadziała, dopóki nie zrobisz jakiegoś paskudnego włamania za pomocą obietnic.

Further reading on injectables

9

można wstrzykiwać stałych i innych dostawców do dostawcy. Nie usług ani fabryk - z jednym wyjątkiem. Wygląda na to, że możesz wprowadzić usługę $injector do dostawcy - przynajmniej możesz w AngularJS 1.3.16.

.provider('foo', ['$injector', function ($injector) { 
    var messagePrefix = $injector.get('msgPrefix'); 
    this.message = ''; 

    this.$get = function() { 
    var that = this; 
    return function() { 
     return messagePrefix + that.message; 
    } 
    }; 
}]) 

Można użyć wtryskiwacz poza metody $get, ale nadal nie można dostać usługi z nim w czasie konfiguracji.

See here for a demo.

6

Nawiązując do odpowiedzi IgrCndd, oto jest wzór, który może uniknąć potencjalnej złośliwości:

angular.module('greet',[]).provider('greeter', function() { 

    var $http; 

    function logIt() { 
     console.log($http); 
    } 

    this.$get = ['$http', function(_$http_) { 
     $http = _$http_; 

     return { 
      logIt: logIt 
     }; 
    }]; 
}); 

Uwaga jak podobne tego celu jest równoważne usługi, dzięki czemu konwersja pomiędzy dwoma mniej kłopotliwe:

angular.module('greet',[]).factory('greeter', ['$http', function($http) { 

    function logIt() { 
     console.log($http); 
    } 

    return { 
     logIt: logIt 
    }; 
}); 
Powiązane problemy