Angular2 @ViewChild из базового абстрактного класса TypeScript

Я просматривал @ эту SO Q & A, и интересно, можно ли вместо этого иметь базу abstract class? Вместо interface можно ли иметь разные реализации базового класса в дочерних компонентах, которые доступны для родительского компонента через декоратор @ViewChild в Angular2?

В идеале я хотел бы иметь средства для дочерних компонентов, которые создаются через родительский Router, чтобы иметь возможность вызывать родительский маршрутизатор - имеет ли это смысл? Я хочу, чтобы ребенок мог позвонить parentRouter.navigate(["SomeOtherRoute", { args: 'blah' }]);.

Мой первоначальный подход заключался в том, чтобы дочерние компоненты реализовывали базовый класс, на который родительский компонент мог бы получить ссылку через декоратор @ViewChild. Родитель будет subscribe реагировать на действие дочернего элемента, пытающегося вызвать событие навигации, а его обработчик вызовет router.navigate (поскольку у него есть маршрутизатор на родительском уровне).


person David Pine    schedule 25.04.2016    source источник


Ответы (3)


Вы не можете использовать @ViewChildren() или любой другой подобный декоратор для запроса подклассов компонентов.

Поддерживаются только имена переменных шаблона и конкретные типы компонентов и директив (типы, которые фактически создаются как компоненты в вашем представлении).

person Günter Zöchbauer    schedule 25.04.2016
comment
Спасибо! Затем я собираюсь реализовать сервисный подход, определенный здесь, angular.io/docs/ts/latest/cookbook/. - person David Pine; 25.04.2016
comment
Обычно это предпочтительный способ. - person Günter Zöchbauer; 25.04.2016

Это на самом деле довольно просто. Например, если у вас есть класс EmployeeComponent, который расширяет PersonComponent, который является абстрактным классом.

Вы можете сделать его доступным, добавив это в EmployeeComponent:

providers: [ {provide: PersonComponent, useExisting: EmployeeComponent }]

И используйте ViewChildren() или ContentChildren() в вашем контейнерном компоненте следующим образом:

@ViewChildren(PersonComponent) public persons: QueryList<PersonComponent>;

person NiZa    schedule 02.07.2018
comment
Это должен быть правильный ответ, сработало как шарм. - person Ahmad Shahwan; 21.07.2021

Да! Это возможно, и я считаю, что в некоторых случаях это может быть чище, хотя для вашего случая использования я думаю, что услуга предпочтительнее. Смотрите мой ответ на исходный вопрос об интерфейсах. Я, возможно, должен был разместить это здесь.

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

person Kyle Zimmer    schedule 14.12.2016