Viele große Angular-Anwendungen neigen dazu, sich stark zu wiederholen - derselbe API-Endpunkt, dieselbe Methode für den Umgang mit und die Umwandlung von Daten und so weiter. Eine Technik, mit der Sie dies zumindest abmildern können, ist die Decorate-Methode von AngularJS, mit der Sie jeden bestehenden Dienst erweitern, anpassen oder sogar vollständig ersetzen können. Wie Sie in diesem Beitrag sehen werden, können Sie damit das Framework, in dem Sie Ihre Anwendung erstellen, ändern und erweitern, was zu einer saubereren, besser lesbaren Codebasis führt, die in einem funktionaleren Stil geschrieben ist (das Was, nicht das Wie). Update 11/8 : Das Follow-up ist jetzt live, zusammen mit dem GitHub-Repository.
Eine Funktion, die bei der Entwicklung von AngularJS-Anwendungen nicht oft verwendet wird, ist der $provide-Dienst. Er ist der primäre Dienst zur Registrierung von Komponenten mit dem $injector. Normalerweise würde ein Entwickler dazu Methoden wie $provide.service() oder $provide.factory verwenden, aber dabei handelt es sich lediglich um Hilfsmethoden, die im $provide-Dienst definiert und über angular.module() offengelegt werden. Die Hauptgründe für die Verwendung von $provide im Vergleich zu den Methoden service() und factory() sind beispielsweise die Konfiguration des Dienstes vor seiner Instanziierung. Es mag zwar fortgeschrittenere Anwendungsfälle für die Verwendung von $provide geben, aber ich bin bei der Entwicklung normaler Anwendungen noch nicht darauf gestoßen und ich bin sicher, dass sie auch nicht oft vorkommen werden. Eine der Methoden, die ganz unten in der $provide-Dokumentation aufgeführt sind, ist die Methode decorate(). Sie sieht nicht nach viel aus (schließlich steht sie ganz unten), aber ihre Dokumentation deutet darauf hin, dass sie sehr leistungsfähig ist:
"Ein Service-Dekorator fängt die Erstellung eines Dienstes ab und ermöglicht es, das Verhalten des Dienstes außer Kraft zu setzen oder zu ändern. Das vom Dekorator zurückgegebene Objekt kann der ursprüngliche Dienst sein oder ein neues Dienstobjekt, das den ursprünglichen Dienst ersetzt oder umhüllt und an ihn delegiert."
Dem ist nichts hinzuzufügen. Sie können decorate() verwenden, um das Verhalten von Diensten zu ändern, zu ergänzen oder vollständig zu ersetzen, ohne dass Sie den Code bearbeiten müssen. Das gilt für jeden Code, der nicht Ihr eigener ist - für AngularJS Kerndienste, aber auch für Bibliotheken von Drittanbietern. Es ist das Äquivalent zum Überschreiben von Methoden in OO-Sprachen oder zum Monkey-Patching in dynamischeren Sprachen.
"Ist das nicht böse?", höre ich Sie fragen. Wie bei jeder Frage, die mit Programmierung zu tun hat, lautet die einzig richtige Antwort: Es kommt darauf an. Ich werde Ihnen einige praktische Beispiele dafür geben, wann die Verwendung von
Das Ersetzen benutzerdefinierter Rückrufe durch benannte Methoden ermöglicht einen funktionelleren Programmierstil und erlaubt es den Lesern, den Code als eine Liste von "Was" statt von "Wie" zu lesen und zu schreiben - und er ist außerdem vollständig asynchron. Die Erweiterung von $q ist jedoch nur der Anfang: Jeder Angular-Dienst kann für verschiedene Zwecke erweitert werden - fügen Sie Leistungsüberwachung und Protokollierung zu $http hinzu, setzen Sie allgemeine Präfixe oder feste Eigenschaften für $resource-URLs oder Template-Pfade, was immer Sie wollen. Hinterlassen Sie in den Kommentaren eine Bemerkung darüber, wie Sie decorate() verwendet haben, um eine bessere Anwendung zu erstellen. Bleiben Sie dran für einen kommenden Beitrag, in dem ich ein kleines Open-Source-Projekt veröffentliche, das die Promise-Objekte von Angular um eine Reihe hilfreicher Methoden zur Durchführung gängiger Aufgaben erweitert. Weitere Lektüre, Ressourcen, hilfreiche Links:
- AngularJS Dokumentation über $Provide
- Ng-decorate, eine Bibliothek zur Vereinfachung von Dekorationsdiensten (und eine Präsentation darüber)
- Wie man $q / promises erweitert; dieser Beitrag diente als Inspiration für den Einstieg.
- Kernrichtlinien ausschmücken
- Wie Angular Batarang $rootScope dekoriert, damit es funktioniert(Quelle)
- Das Decorator-Muster auf Wikipedia
Verfasst von

Freek Wielstra
Freek is an allround developer whose major focus has been on Javascript and large front-end applications for the past couple of years, building web and mobile web applications in Backbone and AngularJS.
Contact