Wie hoch ist die Lebensdauer von Abhängigkeiten, die im Nicht-Root-Injektor bereitgestellt werden?Hierarchischer Injektor und Abhängigkeitsdauer
Kontext:
Meine Angular 2 App besteht aus mehreren Abschnitten. Es gibt eine @RouteConfig
an der Wurzel-Komponente mit Routen zu den Komponenten A
, B
und C
. Die Komponente B
hat ein Kind @RouteConfig
zu den Unterabschnitten x
und y
.
/A
/B
/x
/y
/C
Component x
q
einen Service benötigt. Wie in J. Papa's Angular 2 style guide empfohlen, sofern ich den Dienst zu dem Injektor auf der Komponentenebene x
, d.h.
@xComponent({
providers: [q]
})
export class xComponent { ... }
Dienst q
Anfragen und speichert intern einige Daten. Ich hatte den Eindruck, dass es sich bei den Diensten um Singletons handelt und dass die Daten bei nachfolgenden Besuchen unter /B/x
aus dem Cache verfügbar wären. Mit dem obigen Setup werden die Daten jedes Mal, wenn der Benutzer den Abschnitt /B/x
öffnet, erneut angefordert. Ich legte eine console.log("creating q")
in den Konstruktor für Service q
und sehen, dass eine neue Instanz des Dienstes erstellt wird, wann immer /B/x
besucht wird.
Wenn ich den Dienst auf der Ebene der Komponente /B
liefern, wird der Wert zwischengespeichert, wenn zwischen /B/x
und /B/y
, verlor aber die Navigation, wenn sie entweder /A
oder /C
navigieren.
Es scheint, dass der Injektor zerstört wird, wenn die Komponente zerstört wird. Ist das erwartetes Verhalten?
Was ist der richtige Weg, um die App so zu konfigurieren, dass der Dienst nicht neu erstellt wird? Natürlich könnte ich den Dienst auf der Ebene der Root-Komponenten bereitstellen, aber vielleicht fehlt mir etwas?
Danke, der "mit den Komponenten zerstört" -Teil war was ich vermisste. Ich frage mich - ist das irgendwo dokumentiert? Es scheint weder im Artikel von ibdtram.io noch in den Dokumenten von Angular 2 erwähnt zu werden. –
@ RonaldZarīts Ich denke nicht, aber das ist der logische Weg, denn sonst würden Sie eine Tonne Injektoren in einer riesigen Anwendung herumliegen lassen. – Dinistro