2016-04-25 6 views
4

Ich suchte @this SO Q & A, und fragte mich, ob es möglich war, eine Basis abstract class stattdessen zu haben? Statt einer interface ist es möglich, unterschiedliche Implementierungen einer Basisklasse in untergeordneten Komponenten zu haben, die für die Stammkomponente über den @ViewChild Dekorator in Angular2 zugänglich sind?Angular2 - @ViewChild von TypeScript Basis abstrakten Klasse

Idealerweise hätte ich gerne eine Möglichkeit für untergeordnete Komponenten, die über einen Elternknoten Router instanziiert werden, um den übergeordneten Router aufrufen zu können - macht das Sinn? Ich möchte, dass das Kind parentRouter.navigate(["SomeOtherRoute", { args: 'blah' }]); anrufen kann.

Mein erster Ansatz bestand darin, die untergeordneten Komponenten eine Basisklasse implementieren zu lassen, die die übergeordnete Komponente über den @ViewChild Decorator beziehen würde. Das übergeordnete Element würde subscribe für die Aktion des untergeordneten Objekts sein, das versucht, ein Navigationsereignis aufzurufen, und sein Handler würde router.navigate aufrufen (da es den Router auf der übergeordneten Ebene hat).

Antwort

4

Sie können @ViewChildren() oder einen der ähnlichen Dekoratoren nicht verwenden, um Unterklassen von Komponenten abzufragen.

Nur Namen von Vorlagenvariablen und konkrete Komponenten- und Anweisungstypen (die Typen, die tatsächlich als Komponente in Ihrer Ansicht instanziiert werden) werden unterstützt.

+0

Vielen Dank! Ich werde dann den hier definierten Service-Ansatz implementieren, https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service. –

+0

Das ist normalerweise der bevorzugte Weg. –

0

Ja! Es ist möglich, und ich finde, dass es in einigen Fällen sauberer sein kann, obwohl ich für Ihren Anwendungsfall denke, dass ein Dienst vorzuziehen ist. Siehe meine Antwort auf die ursprüngliche Frage zu Schnittstellen. Ich hätte es vielleicht hier gepostet.

https://stackoverflow.com/a/41151492/4293638