Angular2 - @ViewChild из базового абстрактного класса TypeScript
Я искал @ это так Q & A, и задавался вопросом, можно ли было иметь базу abstract class
вместо? Скорее чем interface
, возможно ли иметь разные реализации базового класса в дочерних компонентах, которые доступны для родительского компонента через @ViewChild
декоратор в Angular2?
В идеале я хотел бы иметь средства для дочерних компонентов, которые создаются с помощью родителя Router
быть способным вызывать родительский маршрутизатор - имеет ли это смысл? Я хочу чтобы ребенок мог звонить parentRouter.navigate(["SomeOtherRoute", { args: 'blah' }]);
,
Мой первоначальный подход состоял в том, чтобы дочерние компоненты реализовали базовый класс, на который родительский компонент получал бы ссылку через @ViewChild
декоратор. Родитель будет subscribe
к действию ребенка, пытающегося вызвать событие навигации, и его обработчик вызовет router.navigate
(поскольку у него есть маршрутизатор на родительском уровне).
3 ответа
Вы не можете использовать @ViewChildren()
или любой из подобных декораторов для запроса подклассов компонентов.
Поддерживаются только имена переменных шаблонов и конкретных типов компонентов и директив (типы, которые на самом деле создаются как компоненты в вашем представлении).
Это на самом деле довольно просто. Например, если у вас есть класс EmployeeComponent, который расширяет PersonComponent, который является абстрактным классом.
Вы можете сделать это доступным, добавив это в EmployeeComponent:
providers: [ {provide: PersonComponent, useExisting: EmployeeComponent }]
И используйте ViewChildren() или ContentChildren() в вашем компоненте контейнера следующим образом:
@ViewChildren(PersonComponent) public persons: QueryList<PersonComponent>;
Да! Это возможно, и я считаю, что в некоторых случаях это может быть чище, хотя для вашего случая использования я думаю, что услуга предпочтительнее. Смотрите мой ответ на оригинальный вопрос об интерфейсах. Возможно, мне следовало бы опубликовать это здесь.