У меня есть приложение с лениво загруженными модулями.
В одном конкретном модуле с ленивой загрузкой у меня есть родительский компонент, который имеет router-outlet
.
В этом родительском компоненте у меня есть кнопка, которая в основном генерирует событие, используя общую службу (предоставленную в модуле с ленивой загрузкой).
каждый дочерний компонент (который загружается в router-outlet
) подписывается на это событие, используя один и тот же общий сервис!
Я попытался воссоздать свой вариант использования в следующем plunkr, используя демонстрацию героев.
Откройте Инструменты разработчика, чтобы просмотреть console
сообщений.
- Нажмите на ссылку
Heroes
(она должна быть выбрана по умолчанию). - Нажмите на элемент героя из списка.
- Нажмите на ссылку
Admin
. - Нажмите кнопку
Emit Test
(верхняя правая навигация)
В консоли вы увидите, что событие было получено обоими компонентами, даже если оба компонента не должны быть «активными» !!!
1) Это задумано?
2) Как узнать, является ли текущий Компонент активным?
РЕЗЮМЕ/ОБНОВЛЕНИЕ
Насколько я понимаю, на EventEmitter/Subject можно подписаться сколько угодно раз, но при отказе от подписки вы не можете использовать его/подписаться на него AFAIK.
Мое решение было:
1) в сервисе я закончил делать следующее:
get(){
if (!this.testEvent.closed) {
this.testEvent.complete();
this.testEvent.unsubscribe();
}
this.testEvent= new EventEmitter<void>();
return this.testEvent;
}
}
2) В каждом компоненте подписываюсь на событие, добавил ngDestroy и отписал событие:
ngOnDestroy() {
this.testEvent.unsubscribe();
}
app/heroes/hero-list.component.ts
иapp/heroes/hero-detail.component.ts
. - person A.Akram   schedule 06.11.2016event.emit()
, он должен достигать только активных компонентов, которые загружены в DOM! - person A.Akram   schedule 06.11.2016router-outlet
(DOM), экземпляр компонента больше не должен существовать! - person A.Akram   schedule 06.11.2016