2013-10-16 13 views
13

Próbuję użyć funkcji "dekoratora" Angulara, aby dodać funkcjonalność do niektórych dyrektyw. Załóżmy, że moja dyrektywa nazywa się myDirective. Mój kod wygląda następująco:Angular - dekorowanie dyrektyw

angular.module('app').config([ 
    '$provide', function($provide) { 
    return $provide.decorator('myDirective', [ 
     '$delegate', '$log', function($delegate, $log) { 
     // TODO - It worked! Do something to modify the behavior 

     $log.info("In decorator"); 
     } 
    ]); 
    } 

]);

Wciąż otrzymuję komunikat:

Uncaught Error: [$injector:unpr] Unknown provider: myDirectiveProvider from app 

Aby najlepiej jak potrafię, dyrektywy są już zarejestrowane w czasie funkcja dekorator biegnie. Wszelkie docenianie byłoby docenione!

+0

Patrz: http://stackoverflow.com/questions/18335574/decorating-the-ng-click-directive-in-angularjs – XML

Odpowiedz

20

W tym artykule pokazano, w jaki sposób można używać dekoratora() z dyrektywami.

Trzeba tylko dodać "Dyrektywę" jako przyrostek nazwy. Stąd w moim przykładzie I should have been robi

return $provide.decorator('myDirectiveDirective', ['$delegate', '$log', function($delegate, $log) { 
    // TODO - It worked! Do something to modify the behavior 
    $log.info("In decorator"); 

    // Article uses index 0 but I found that index 0 was "window" and index 1 was the directive 
    var directive = $delegate[1]; 
} 

http://angular-tips.com/blog/2013/09/experiment-decorating-directives/

+1

Fantastyczna, uczysz się czegoś każdego dnia. wydaje mi się, że '$ delegat' powinien być listą wszystkich dyrektyw we wszystkich załadowanych modułach o nazwie' myDirective' Wydaje się być może niepokojącym, że indeks 0 będzie oknem, chyba że czegoś mi brakuje. trzeba uważać, ponieważ kolejność w '$ delegate' będzie zależała od tego, jakie moduły zamówień i dyrektywy są zdefiniowane, więc musisz zachować to spójnie.Możesz również chcieć usunąć niechciane dyrektywy z listy (' okno') - Nadal chciałem trzymać się udokumentowanych sposobów, chyba że musisz, ale jeśli to konieczne, to bardzo przydatne! – Andyrooger

+0

Dodanie sufiksu "Dyrektywy" ma kluczowe znaczenie! – Leon

+0

Ten ruch już nie działa, gular 1.4.x pozwala tylko na korzystanie z dekoratorów w dostawcach i usługach. –

1

Dekoratory utworzone zgodnie z metodą decorator są przeznaczone tylko dla usług tylko. Muszą być utworzone za pomocą service, factory, provider lub value. Zobacz dokumenty here.

Jeśli chcesz ozdobić dyrektywę, możesz wprowadzić inną dyrektywę o tej samej nazwie. Obie dyrektywy będą używane, gdy DOM zostanie skompilowany, i możesz zdefiniować kolejność kompilacji za pomocą priority.

Ewentualnie, jeśli jesteś w stanie zmodyfikować kod, który używa dyrektywy, którą próbujesz udekorować, możesz po prostu stworzyć nową dyrektywę, która używa oryginału w swoim szablonie.

+2

I okazało się, że możesz używać dekoratora do dyrektyw, jeśli do nazwy dodasz "dyrektywę". Dlatego w moim przykładzie powinienem wykonać $ provide.decorator ("myDirectiveDirective" ... – blaster

+3

To jest niepoprawne Zobacz autotyczną odpowiedź @ blaster, która pokazuje jak dekorować dyrektywy – XML

Powiązane problemy