2013-04-18 3 views
139

Ich bin gespannt, was genau Dekoratoren in AngularJS sind. Es gibt nicht viele Informationen online für Dekorateure außer für einen Klappentext in der AngularJS documentation und eine kurze (wenn auch interessante) Erwähnung in einer youtube video.Was sind "Dekorateure" und wie werden sie verwendet?

die Winkel Jungs setzen es ein Dekorateur ist:

Dekoration der Service, ermöglicht es dem Dekorateur den Dienst Instanz Schaffung abzufangen. Die zurückgegebene Instanz kann die ursprüngliche Instanz oder eine neue Instanz sein, die an die ursprüngliche Instanz delegiert.

Ich weiß nicht wirklich, was das bedeutet , und ich bin nicht sicher, warum Sie diese Logik aus dem Dienst selbst trennen würden. Zum Beispiel, wenn ich unter verschiedenen Bedingungen etwas anderes zurückgeben wollte, würde ich einfach andere Argumente an die relevanten Funktionen übergeben oder eine andere Funktion verwenden, die diesen privaten Zustand teilt.

Ich bin immer noch eine Art AngularJS-Noob, also bin ich sicher, dass es nur Ignoranz und/oder schlechte Angewohnheiten sind, die ich abgeholt habe.

Antwort

211

Ein guter Anwendungsfall von $provide.decorator ist, wenn Sie geringfügige "zwicken" auf einige Drittanbieter/Upstream-Service, auf dem Ihr Modul abhängt, während der Service intakt verlassen müssen (weil Sie nicht der Besitzer/Betreuer von sind der Service). Here ist eine Demonstration auf Plunkr.

+5

Super Beispiel. Ich habe mich gefragt, wie man die Funktionalität von Drittanbieter-Modulen erweitern kann, ohne sich in sie einzumischen –

+5

Tun Dekorateure tatsächlich alle Instanzen eines Dienstes, oder sind sie nur auf das Modul beschränkt, das sie verziert? Mit anderen Worten sagen wir, dass ich Modul A habe, das einen Service von Modul B schmückt. Ich habe dann Modul C, das von Modul A und Modul B abhängt. Innerhalb von Modul C ist der Service von Modul B die ursprüngliche oder dekorierte Version? –

+2

@JonJaques - Das ist eine gute Frage. Ich bin auf eine solche Situation nicht gestoßen. Wenn ich raten sollte, sollte die Version des Dienstes, den Modul C sieht, der von Modul A sein, aber ich kann das nicht sicher sagen, bis ich es selbst versuche. Warum schreibst du nicht einfach ein plunkr/jsffidle und experimentierst damit. Es wäre toll, wenn Sie Ihre Entdeckung mit uns teilen könnten. Prost. – tamakisquare

63

Dekoratoren ermöglichen es uns, bereichsübergreifende Probleme zu trennen und es den Diensten zu ermöglichen, das Prinzip der einheitlichen Verantwortlichkeit zu wahren, ohne sich Gedanken über den "Infrastruktur" -Code machen zu müssen.

Praktische Anwendungen von Dekorateure:

  • Caching: wenn wir einen Service haben, die Anrufe möglicherweise teuer HTTP macht, können wir den Service in einem Cache-Dekorateur wickeln, die, bevor sie den externen Anruf lokalen Speicher überprüft.
  • Debugging/Tracing: Haben Sie einen Schalter abhängig von Ihrer Entwicklung/Produktion Konfiguration, die Ihre Dienste mit Debuggen oder Tracing Wrapper verziert.
  • Drosselung: Umhüllen Sie häufig ausgelöste Anrufe in einem Debouncing-Wrapper. Ermöglicht uns beispielsweise die einfache Interaktion mit ratenbegrenzten Diensten.

In all diesen Fällen beschränken wir den Code im Service auf seine Hauptverantwortung.

10

decorator kann Service Instanz abfangen, die von factory, service, value, provider erstellt wurde, und gibt die Optionen zum Ändern einige instance(service), die sonst nicht konfigurierbar ist/mit Optionen.

Es kann auch Mock-up-Instanzen für Testzwecke bereitstellen, z. B. $http.

+1

Es ist erwähnenswert, dass Sie auch "Direktive" Definitionen als [von Ben Nadel] ( –

+0

) überschreiben können (http://www.bennadel.com/?site-photo=490) Hier ist die Referenz in der Offizielle Angular-Dokumentation: [https://docs.angularjs.org/guide/decorators](https://docs.angularjs.org/guide/decorators) –

3

In einfachen Worten können wir sagen, dass es wie eine Erweiterungsmethode ist. Für Ex. Wir haben eine Klasse und es gibt zwei Methoden und zur Laufzeit wollen wir mehr Methoden hinzufügen, dann verwenden wir Decorator.

Wir können $ provider.decorator nicht mit Konstanten verwenden, da wir die Konstanten nicht ändern können, die die schreibgeschützte Eigenschaft haben.

1

Kurz Dekorateure kann wie folgt beschrieben werden: -

Dekorateur Funktion fängt die Schaffung eines Dienstes, es außer Kraft zu setzen oder das Verhalten des Dienstes ändern ermöglicht.

Es nutzt den $provide Dienst von Winkel- und modifiziert oder ersetzt die Implementierung eines anderen Dienstes

$provide.decorator('service to decorate',['$delegate', function($delegate) { 
    // $delegate - The original service instance, 
    //    which can be replaced, monkey patched, 
    //    configured, decorated or delegated to. 
    //    ie here what is there in the 'service to decorate' 

    // This function will be invoked, 
    // when the service needs to be provided 
    // and should return the decorated service instance. 
    return $delegate; 
}]); 

Beispiel:

$provide.decorator('$log', ['$delegate', function($delegate) { 
    // This will change implementation of log.war to log.error 
    $delegate.warn = $delegate.error; 
    return $delegate; 
}]); 

Anwendungen

Zusätzlich Antwort auf @JBland.

  • Anwendung breite Ländereinstellungen: -

    Sie ein Beispiel here

  • Changiging Standardverhalten und bestehende Implementierung eines Service durch Winkel Dienst: -

    Sie finden ein Beispiel here

  • Schaltverhalten oder einer Funktion in verschiedenen Umgebungen.

Verwandte Themen