Beim Generieren von Diensten in der Angular-CLI werden zusätzliche Metadaten mit der Eigenschaft "bereitgestellt in" mit dem Standardwert "root" für den Injectable-Dekorator hinzugefügt.
@Injectable({
providedIn: 'root',
})
Was genau macht vorausgesetzt? Ich gehe davon aus, dass dies den Dienst wie einen Singleton-Dienst vom Typ 'global' für die gesamte Anwendung verfügbar macht. Wäre es jedoch nicht sauberer, solche Dienste im Provider-Array des AppModule zu deklarieren?
AKTUALISIEREN:
Für alle anderen bietet der folgende Absatz eine weitere gute Erklärung, insbesondere wenn Sie Ihren Dienst nur für ein Funktionsmodul bereitstellen möchten.
Es gibt jetzt eine neue, empfohlene Möglichkeit, einen Anbieter direkt im
@Injectable()
Dekorateur mithilfe des neuenprovidedIn
Attributs zu registrieren . Es akzeptiert'root'
als Wert oder als Modul Ihrer Anwendung. Wenn Sie verwenden'root'
, wird Ihrinjectable
Benutzer als Singleton in der Anwendung registriert, und Sie müssen ihn nicht zu den Anbietern des Root-Moduls hinzufügen. Wenn Sie das Modul verwendenprovidedIn: UsersModule
,injectable
wird es ebenfalls als Anbieter des Moduls registriert,UsersModule
ohne esproviders
dem Modul hinzuzufügen . "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
UPDATE 2:
Nach weiteren Untersuchungen habe ich entschieden, dass es nur nützlich ist, zu haben providedIn: 'root'
Wenn Sie provide
einen Dienst in einem anderen Modul als dem Root-Modul ausführen möchten , ist es besser, das providers
Array in den Dekoratoren des Feature-Moduls zu verwenden, da Sie sonst von zirkulären Abhängigkeiten geplagt werden. Interessante Diskussionen finden Sie hier - https://github.com/angular/angular-cli/issues/10170
Antworten:
Wenn Sie BereitgestelltesIn verwenden, wird das Injizierbare als Anbieter des Moduls registriert, ohne es den Anbietern des Moduls hinzuzufügen.
Von
Docs
quelle
providedIn
Attributs definieren, wo der Service bei Verwendung des@Injectable()
Dekorators initialisiert werden soll . Anschließend sollten Sie es aus dem Anbieterattribut IhrerNgModule
Deklaration sowie aus der Importanweisung entfernen. Dies kann dazu beitragen, die Bundle-Größe zu verringern, indem nicht verwendeter Code aus dem Bundle entfernt wird.providedIn: 'root'
ist der einfachste und effizienteste Weg, um Dienste bereitzustellen, seit Angular 6:Weitere Informationen finden Sie in der Dokumentation und in den häufig gestellten Fragen zu NgModule
Übrigens:
providers
Sie stattdessen das Array von NgModule.quelle
Aus Dokumenten
Markiert eine Klasse als für Injector zur Erstellung verfügbar.
Der Dienst selbst ist eine Klasse, die von der CLI generiert wurde und die mit @Injectable () dekoriert ist.
Legt fest, welche Injektoren das Injektionsmittel bereitstellen, indem sie es entweder einem @ NgModule oder einem anderen InjectorType zuordnen oder angeben, dass dieses Injektionsmittel im 'Root'-Injektor bereitgestellt werden soll, der in den meisten Apps der Injektor auf Anwendungsebene ist.
Wenn Sie den Dienst auf Stammebene bereitstellen, erstellt Angular eine einzelne gemeinsam genutzte Dienstinstanz und fügt sie in jede Klasse ein, die danach fragt. Durch die Registrierung des Anbieters in den Metadaten von @Injectable () kann Angular auch eine App optimieren, indem der Dienst aus der kompilierten App entfernt wird, wenn er nicht verwendet wird.
Es kann auch angegeben werden, dass ein Dienst in einem bestimmten @ NgModule bereitgestellt werden soll. Wenn Sie beispielsweise nicht möchten, dass ein Dienst für Anwendungen verfügbar ist, es sei denn, sie importieren ein von Ihnen erstelltes Modul, können Sie festlegen, dass der Dienst im Modul bereitgestellt werden soll
Diese Methode wird bevorzugt, weil sie das Schütteln von Bäumen ermöglicht ( Schütteln von Bäumen) ist ein Schritt in einem Erstellungsprozess, bei dem nicht verwendeter Code aus einer Codebasis entfernt wird ) des Dienstes aktiviert, wenn nichts injiziert wird.
Wenn im Dienst nicht angegeben werden kann, welches Modul es bereitstellen soll, können Sie auch einen Anbieter für den Dienst innerhalb des Moduls deklarieren:
quelle
@Injectable()
?vorausgesetzt, teilt Angular mit, dass der Root-Injektor für die Erstellung einer Instanz Ihres Dienstes verantwortlich ist. Auf diese Weise bereitgestellte Dienste werden automatisch für die gesamte Anwendung verfügbar gemacht und müssen in keinem Modul aufgeführt werden.
Serviceklassen können als eigene Anbieter fungieren, weshalb die Definition im @ Injectable Decorator nur die Registrierung erfordert, die Sie benötigen.
quelle
Nach dem
Documentation
:quelle