2013-03-22 8 views
222

Staram się wprowadzić usługę do dyrektywy jak poniżej:Czy mogę wprowadzić usługę do dyrektywy?

var app = angular.module('app',[]); 
app.factory('myData', function(){ 
    return { 
     name : "myName" 
    } 
}); 
app.directive('changeIt',function($compile, myData){ 
    return { 
      restrict: 'C', 
      link: function (scope, element, attrs) { 
       scope.name = myData.name; 
      } 
     } 
}); 

Ale to wraca mi błąd Unknown provider: myDataProvider. Czy ktoś mógłby zajrzeć do kodu i powiedzieć mi, czy robię coś nie tak?

Odpowiedz

367

Można zrobić zastrzyk na dyrektywach, i wygląda tak jak to robi wszędzie indziej.

app.directive('changeIt', ['myData', function(myData){ 
    return { 
     restrict: 'C', 
     link: function (scope, element, attrs) { 
      scope.name = myData.name; 
     } 
    } 
}]); 
+12

Myślę, że jest to lepsze rozwiązanie, ponieważ działa nawet po zminimalizowaniu kodu. – czerasz

+5

Musiałem dodać "_myData = myData" przed zwróceniem {}, a następnie odwołać się do obiektu jako _myData wewnątrz funkcji łącza. – Jelling

+0

Dzięki @Jelling. Musiałem zrobić to samo. Zastanawiam się, czy ktoś tam może nam powiedzieć, dlaczego ...? – sfletche

19

Zmień definicję dyrektywy z app.module na app.directive. Poza tym wszystko wygląda dobrze. Btw, bardzo rzadko trzeba wstrzykiwać usługę do dyrektywy. Jeśli wstrzykujesz usługę (która zwykle jest źródłem danych lub modelem) do twojej dyrektywy (która jest rodzajem części widoku), tworzysz bezpośrednie połączenie pomiędzy twoim widokiem a modelem. Musisz je rozdzielić, łącząc je za pomocą kontrolera.

Działa dobrze. Nie jestem pewien, co robisz, co jest złe. Oto plusk tego działa.

http://plnkr.co/edit/M8omDEjvPvBtrBHM84Am

+0

Czy możesz podać przykład: proszę – Exception

+0

@ wyjątek Czy umieścisz swój kod w skrzypcach? Mogę rzucić okiem i zobaczyć, dlaczego twój kod nie działa i prawdopodobnie pomoże ci to naprawić. – ganaraj

+0

@Exception dodał działający pluna, który pokazuje działający kod. – ganaraj

9

Możesz również skorzystać z usługi $ inject, aby uzyskać dowolną usługę. Uważam, że jest to przydatne, jeśli nie znam nazwy usługi z wyprzedzeniem, ale znam interfejs usługi. Na przykład dyrektywa, która będzie podłączać tabelę do punktu końcowego ngResource lub ogólnego przycisku kasowania rekordów, który współdziała z dowolnym punktem końcowym interfejsu API. Nie chcesz ponownie implementować dyrektywy table dla każdego kontrolera lub źródła danych.

template.html

<div my-directive api-service='ServiceName'></div> 

my-directive.directive.coffee

angular.module 'my.module' 
    .factory 'myDirective', ($injector) -> 
    directive = 
     restrict: 'A' 
     link: (scope, element, attributes) -> 
     scope.apiService = $injector.get(attributes.apiService) 

teraz twój 'anonimowy' usługa jest w pełni dostępny. Jeśli jest ngResource na przykład można użyć standardowego interfejsu ngResource, aby uzyskać dane

Na przykład:

scope.apiService.query((response) -> 
    scope.data = response 
, (errorResponse) -> 
    console.log "ERROR fetching data for service: #{attributes.apiService}" 
    console.log errorResponse.data 
) 

Znalazłem tę technikę, aby być bardzo przydatna przy wykonywaniu elementów, które współdziałają z punktami końcowymi API zwłaszcza .

Powiązane problemy