In Angular 2 kann eine untergeordnete Komponente ihre übergeordnete Komponente über einen Konstruktorparameter erhalten. Beispiel:
%Vor%Dies funktioniert gut und gut, solange die Eltern und Kinder von verschiedenen Typen sind.
Ein weiterer typischer Anwendungsfall ist jedoch eine Baumstruktur, bei der jeder Baumknoten als separate Komponente angezeigt wird. Was sollten wir tun, wenn jede der Baumknoten-Komponenten Zugriff auf ihren übergeordneten Knoten haben sollte? Ich habe es versucht:
%Vor%Aber das schlägt mit der folgenden Laufzeitausnahme fehl:
%Vor%Ich vermute, der Grund ist, dass Angular 2 die Komponente selbst anstelle ihrer Hauptkomponente injiziert.
Wie kann ich angular angeben, um die übergeordnete Komponente einer Komponente zu injizieren, obwohl sie vom selben Typ ist?
Plunker Ссылка
Angular2 untersucht den aktuellen Injektor für einen Provider. In Ihrem Fall entspricht TreeNodeComponent der Komponente selbst.
Die übergeordnete Komponenteninstanz befindet sich im übergeordneten Injektor.
Ich denke, dass Sie versuchen könnten, eine Injektor-Klasse zu injizieren, um Zugriff auf den Eltern-Injektor zu haben und dann die Instanz der Eltern-Komponente zu bekommen. So ähnlich:
%Vor%Siehe diesen Link für die Dokumentation der Injector-Klasse:
Ich denke, dass der Kommentar von Gunter über die Bindung und den gemeinsamen Dienst besonders relevant ist.
Dieser Beitrag wurde dank Günther gelöst. Ich würde jedoch gerne auf der Grundlage des architektonischen Feedbacks, das ich bekommen habe, nachgehen.
In erster Linie: Ich stimme völlig zu, dass das TreeNodeComponent-Beispiel ein Anti-Pattern ist. Eine datengesteuerte Komponente wie ein Baum sollte durch Datenbindung gesteuert werden. Ich entschuldige mich für dieses Anti-Muster.
Allerdings ist mein tatsächlicher Anwendungsfall (der komplexer zu erklären ist), dass ich ein erweitertes Dropdown-Menü entwickeln möchte. Anforderungen:
Ein Anwendungsbeispiel:
%Vor%Meine Überlegung ist, dass dies mit Datenbindung schwer zu implementieren wäre. Es ist sehr praktisch, Event-Handler zu binden und benutzerdefinierte Komponenten auf diese Weise einzubinden.
Aber ich könnte falsch liegen! Alle Meinungen dazu sind sehr willkommen!
Tags und Links dependency-injection angular