AngularJS: Dienst vs. Anbieter vs. Fabrik
Was sind die Unterschiede zwischen einem Service
, Provider
und Factory
in AngularJS?
3291
3
Was sind die Unterschiede zwischen einem Service
, Provider
und Factory
in AngularJS?
Von der AngularJS-Mailingliste erhielt ich einen erstaunlichen Thread, der Service vs. Factory vs. Provider und deren Injektionsverwendung erklärt. Kompilieren Sie die Antworten:
Services
Syntax:
module.service( 'serviceName', function );
Ergebnis: Wenn Sie serviceName als injizierbares Argument deklarieren, werden Sie mit einer Instanz der Funktion versorgt. Mit anderen Worten
neue FunktionYouPassedToService()
.*Fabriken
Syntax:
module.factory( 'factoryName', function );
Ergebnis: Wenn Sie factoryName als injizierbares Argument deklarieren, erhalten Sie den Wert, der durch den Aufruf der an module.factory übergebenen Funktionsreferenz zurückgegeben wird.
Provider
Syntax:
module.provider( 'providerName', function );
Ergebnis: Wenn Sie providerName als injizierbares Argument deklarieren, werden Sie mit
(new ProviderFunction()).$get()
versorgt. Die Konstruktorfunktion wird instanziiert, bevor die $get-Methode aufgerufen wird -ProviderFunction
ist die Funktionsreferenz, die an module.provider übergeben wird.Provider haben den Vorteil, dass sie während der Konfigurationsphase des Moduls konfiguriert werden können.
Siehe hier für den bereitgestellten Code.
Hier's eine große weitere Erklärung von Misko:
In diesem Fall gibt der Injektor den Wert einfach so zurück, wie er ist. Aber was ist, wenn Sie den Wert berechnen wollen? Dann verwenden Sie eine Fabrik
Fabrik" ist also eine Funktion, die für die Erstellung des Wertes verantwortlich ist. Beachten Sie, dass die Fabrikfunktion nach anderen Abhängigkeiten fragen kann.
Was aber, wenn Sie mehr OO sein wollen und eine Klasse namens Greeter haben?
Dann müssten Sie zum Instanziieren schreiben
Dann könnten wir nach 'greeter' im Controller wie folgt fragen
Aber das ist viel zu wortreich. Ein kürzerer Weg, dies zu schreiben, wäre
provider.service('greeter', Greeter);
Was aber, wenn wir die Klasse
Greeter
vor der Injektion konfigurieren wollten? Dann könnten wir schreibenDann können wir dies tun:
Nebenbei bemerkt,
service
,factory
undvalue
sind alle von provider abgeleitet.[JS Fiddle Demo][1]
" Hallo Welt " Beispiel mit
factory
/service
/provider
:Beim Herumspielen mit Anbietern ist mir etwas Interessantes aufgefallen.
Die Sichtbarkeit von Injectables ist bei Providern anders als bei Services und Factories. Wenn Sie eine AngularJS "Konstante" deklarieren (z. B.
myApp.constant('a', 'Robert');
), können Sie sie in Dienste, Factories und Anbieter injizieren.Wenn Sie jedoch einen AngularJS "Wert" deklarieren (z. B.
myApp.value('b', {Name: 'Jones'});
), können Sie ihn in Dienste und Factories injizieren, aber NICHT in die Funktion zur Erstellung des Providers. Sie können es jedoch in die Funktion "$get" injizieren, die Sie für Ihren Anbieter definieren. Dies wird in der AngularJS-Dokumentation erwähnt, ist aber leicht zu übersehen. Sie finden es auf der Seite %provide in den Abschnitten über die Methoden value und constant.http://jsfiddle.net/R2Frv/1/