Was sind die Unterschiede zwischen diesen beiden und was sind die Anwendungsfälle für jeden?
Die Dokumente sind nicht gerade hilfreich:
forRoot erstellt ein Modul, das alle Anweisungen, die angegebenen Routen und den Routerdienst selbst enthält.
forChild erstellt ein Modul, das alle Anweisungen und die angegebenen Routen enthält, jedoch nicht den Routerdienst.
Meine vage Vermutung ist, dass eines für das 'Haupt'-Modul und das andere für alle importierten Module ist (da der Dienst bereits vom Hauptmodul verfügbar wäre), aber ich kann mir keinen Anwendungsfall vorstellen.
RouterService
für eine einzelne Angular2-Anwendung geben.forRoot
initialisiert diesen Dienst und registriert ihn zusammen mit einigenforChild
Routenkonfigurationen bei DI, registriert jedoch nur zusätzliche Routenkonfigurationen und weist Angular2 anRouterService
,forRoot
die erstellten erneut zu verwenden.Antworten:
Ich empfehle dringend, diesen Artikel zu lesen:
Modul mit Anbietern
Wenn Sie ein Modul importieren, verwenden Sie normalerweise einen Verweis auf die Modulklasse:
Auf diese Weise werden alle im Modul registrierten Anbieter
A
zum Root-Injektor hinzugefügt und sind für die gesamte Anwendung verfügbar.Es gibt aber noch eine andere Möglichkeit, ein Modul bei Anbietern wie diesem zu registrieren:
Dies hat die gleichen Auswirkungen wie die vorherige.
Sie wissen wahrscheinlich, dass faul geladene Module einen eigenen Injektor haben. Angenommen, Sie möchten sich registrieren
AService
, um für die gesamte AnwendungBService
verfügbar zu sein , einige jedoch nur für faul geladene Module. Sie können Ihr Modul folgendermaßen umgestalten:Jetzt ist
BService
es nur für untergeordnete, faul geladene ModuleAService
verfügbar und für die gesamte Anwendung.Sie können das oben genannte Modul wie folgt als exportiertes Modul umschreiben:
Wie ist das für RouterModule relevant?
Angenommen, auf beide wird mit demselben Token zugegriffen:
Mit separaten Konfigurationen erhalten Sie, wenn Sie
token
von einem faul geladenen Modul anfordern ,BService
genau wie geplant.RouterModule verwendet
ROUTES
Token, um alle für ein Modul spezifischen Routen abzurufen . Da in diesem Modul spezifische Routen für verzögert geladene Module verfügbar sein sollen (analog zu unserem BService), wird für die verzögert geladenen untergeordneten Module eine andere Konfiguration verwendet:quelle
forRoot
ein verzögert geladenes Modul aufrufen, werden neue Instanzen aller globalen Dienste im Injektor für verzögert geladene Module erstellt. Ja, dies führt zu unvorhersehbaren Ergebnissen. Lesen Sie auch diesen Artikel Vermeiden Sie häufige Verwechslungen mit Modulen in AngularIch denke, die Antworten sind richtig, aber ich denke, etwas fehlt.
Was fehlt, ist "warum und was es löst?".
In Ordnung, lass uns anfangen.
Lassen Sie uns zuerst einige Informationen erwähnen:
Alle Module haben Zugriff auf die Root-Dienste.
So können auch faul geladene Module einen Dienst nutzen, der in bereitgestellt wurde
app.module
.Was passiert, wenn sich ein faul geladenes Modul selbst einen Dienst bereitstellt, den das App-Modul bereits bereitgestellt hat? Es wird 2 Instanzen geben.
Es ist kein Problem, aber manchmal ist es .
Wie können wir es lösen? Importieren Sie einfach kein Modul mit diesem Anbieter in faul geladene Module.
Ende der Geschichte.
Dies soll nur zeigen, dass faul geladene Module einen eigenen Injektionspunkt haben (im Gegensatz zu nicht faul geladenen Modulen).
Aber was passiert, wenn ein freigegebenes (!) Modul deklariert
providers
wurde und dieses Modul von faul und importiert wirdapp.module
? Wieder, wie gesagt, zwei Fälle.Wie können wir dies im gemeinsam genutzten Modul POV lösen? Wir brauchen einen Weg, um nicht zu benutzen
providers:[]
! Warum? weil sie automatisch in Lazy und App.module importiert werden und wir das nicht wollen, da wir gesehen haben, dass jede eine andere Instanz hat.Nun, es stellt sich heraus, dass wir ein gemeinsam genutztes Modul deklarieren können
providers:[]
, das keine Anbieter hat , aber dennoch Anbieter bereitstellt (sorry :))Wie? So was :
Beachten Sie, keine Anbieter.
Aber
Was passiert jetzt, wenn app.module das gemeinsam genutzte Modul mit POV of Service importiert? NICHTS.
Was passiert jetzt, wenn ein Lazy-Modul das gemeinsam genutzte Modul mit POV of Service importiert? NICHTS.
Eingabe des manuellen Mechanismus über Konvention:
Sie werden feststellen, dass die Anbieter auf den Bildern
service1
und habenservice2
Dies ermöglicht uns den Import
service2
für träge geladene Module undservice1
für nicht faul geladene Module. ( Husten ... Router ... Husten )Übrigens, niemand hält Sie davon ab,
forRoot
innerhalb eines faulen Moduls anzurufen . Aber Sie werden 2 Instanzen haben, weil Sieapp.module
es auch tun sollten - also tun Sie es nicht in faulen Modulen.Auch - wenn
app.module
AnrufeforRoot
(und niemand ruftforchild
) - ist das in Ordnung, aber Root-Injektor wird nur habenservice1
. (für alle App verfügbar)Warum brauchen wir es also? Ich würde sagen :
Das ist es.
Nun - es ist im obigen Satz versteckt ^
Die Konvention (!!!) erlaubt es, Singleton zu sein - oder genauer gesagt - wenn Sie der Konvention nicht folgen, erhalten Sie KEINEN Singleton.
Also , wenn Sie nur laden
forRoot
in derapp.module
, dann bekommt man nur eine Instanz , weil man nur nennen sollteforRoot
es in derapp.module
.Übrigens - an dieser Stelle können Sie vergessen
forChild
. Das faul geladene Modul sollte / wird nicht aufrufenforRoot
- Sie sind also in POV von Singleton sicher.forRoot und forChild sind kein unzerbrechliches Paket - es gibt nur keinen Grund, Root aufzurufen, das offensichtlich nur geladen wird,
app.module
ohne die Fähigkeit für faule Module zu haben, ihre eigenen Dienste zu haben, ohne neue Dienste zu erstellen, die sein sollten -singleton.Diese Konvention
forChild
bietet Ihnen eine nette Möglichkeit , "Dienste nur für faul geladene Module" zu nutzen.Hier ist eine Demo Root-Anbieter liefert positive Zahlen, faul geladene Module ergeben negative Zahlen.
quelle
In der Dokumentation wird klar angegeben, wozu diese Unterscheidung hier dient: https://angular.io/docs/ts/latest/guide/ngmodule.html#!#core-for-root
Jede Anwendung hat genau einen Startpunkt (root), mit dem der Hauptroutingdienst initialisiert werden soll
forRoot
, während Routen für bestimmte "untergeordnete" Funktionen zusätzlich registriert werden solltenforChild
. Dies ist äußerst nützlich für Submodule und verzögert geladene Module, die beim Start der Anwendung nicht geladen werden müssen. Wie @Harry Ninh sagte, werden sie aufgefordert, RouterService anstelle der Registrierung des neuen Dienstes wiederzuverwenden, was zu einem Laufzeitfehler führen kann.quelle
Wenn appRoutes einen Pfad zu verschiedenen Funktionen auf der Site enthält (Admin Crud, User Crud, Book Crud) und wir sie trennen möchten, können wir dies einfach tun:
Und für Routen:
quelle