2013-10-16 8 views
13

Ich versuche Angulars "Decorator" -Funktion zu verwenden, um einigen Direktiven Funktionalität hinzuzufügen. Angenommen, der Name meiner Direktive lautet myDirective. Mein Code sieht so aus:Angular - Decorating Direktiven

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"); 
     } 
    ]); 
    } 

]);

ich diese Mitteilung erhalte:

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

Nach bestem meine Fähigkeit, werden die Richtlinien bereits von der Zeit registriert die Dekorateur Funktion ausgeführt wird. Jeder Einblick würde geschätzt werden!

+0

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

Antwort

20

Dieser Artikel zeigt, wie Sie in der Tat Decorator() mit Anweisungen verwenden können.

Sie müssen nur "Direktive" als Suffix für den Namen angeben. Daher wird in meinem Beispiel habe ich getan

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

Fantastisch, du lernst jeden Tag etwas Im Code scheint '$ delegate' eine Liste aller Direktiven in allen geladenen Modulen mit dem Namen' myDirective' zu ​​sein. Es erscheint mir möglicherweise besorgniserregend, dass der Index 0 ein Fenster wäre, es sei denn, ich vermisse etwas. Sie würden muss aufpassen, da die Reihenfolge in '$ delegate' davon abhängt, welche Befehlsmodule und -direktiven definiert sind, also müssen Sie dies konsistent halten. Sie können auch unerwünschte Direktiven aus der Liste entfernen (' window') - Ich würde mich immer noch an die dokumentierten Möglichkeiten halten, es sei denn, Sie müssen das tun, aber wenn Sie es brauchen, ist das sehr nützlich! – Andyrooger

+0

Das Hinzufügen des Suffix 'Direktive' ist entscheidend! – Leon

+0

Dieser Zug funktioniert nicht mehr, ein gular 1.4.x erlaubt nur den Einsatz von Dekorateuren in Anbietern und Diensten. –

1

Dekoratoren, die mit der decorator-Methode erstellt wurden, sind nur für -Dienste. Sie müssen mit service, factory, provider oder value erstellt werden. Siehe die Dokumentation here.

Wenn Sie eine Direktive dekorieren möchten, können Sie eine andere Direktive mit demselben Namen erstellen. Beide Direktiven werden verwendet, wenn das DOM kompiliert wird, und Sie können die Kompilierungsreihenfolge mithilfe von priority definieren.

Wenn Sie in der Lage sind, den Code zu ändern, der die zu dekorierende Anweisung verwendet, können Sie eine neue Direktive erstellen, die das Original in der Vorlage verwendet.

+2

I festgestellt, dass Sie Dekorator für Richtlinien verwenden können, wenn Sie "Richtlinie" als Suffix für den Namen enthalten. Daher hätte ich in meinem Beispiel $ provider.decorator ('myDirectiveDirective' ... – blaster

+3

Das ist falsch. Siehe @ blasters Selbst-Antwort, die zeigt, wie man Anweisungen schmückt. – XML

Verwandte Themen