угловой доступ к событиям жизненного цикла компонента из родительского модуля

#angular #angular-routing

#angular #angular-маршрутизация

Вопрос:

У нас есть следующее требование.

У нас есть основной корневой макет в корневом компоненте приложения. В этой компоновке у нас есть маршрутизатор-розетка, и компоненты вводятся в маршрутизатор-розетку с помощью механизма угловой маршрутизации.

Нам нужно подключиться из главного корневого макета к событиям жизненного цикла компонентов, вводимых в маршрутизатор-розетку.

Потому что, если мы регистрируемся в NavigationEnd событий маршрутизатора, он иногда вызывается перед компонентом ngOnInit. Таким образом, мы знаем, когда заканчивается навигация, но мы не знаем, когда компонент закончил выполнять работу. В идеале мы хотели бы подключаться к событиям жизненного цикла компонента.

Также требуется, чтобы внедряемые компоненты не наследовали специальный класс или что-то в этом роде…

Как это можно сделать?

Ответ №1:

Возможно, вы можете создать общую службу, о которой вы сообщаете, когда нужные компоненты вызываются в перехватах жизненного цикла, таких как ngOnInit , ngOnDestroy и т.д.

 @Injectable({
  providedIn: 'root'
})
export class LifeCycleHookService{
    private hookSubject = new Subject<any>();
    onHookFired = this.hookSubject.asObservable();


    //  component: Component - Reference to the component
    //  hookType: Enum | string - OnInit, OnDestroy etc.
    fireHook = (component, hookType) => {
      this.hookSubject.next({component, hookType});
    }

}
  

Затем в вашем родительском компоненте вы можете подписаться на onHookFired службу.

 @Component(
...
)
export class ParentComponent implements OnInit{
   constructor(private hookService: LifeCycleHookService){}

  ngOnInit(){
    this.hookService.onHookFired.subscribe((event) => {
      // event.component
      // event.hookType
    })
  }
}
  

Затем в ваших дочерних компонентах вы можете сообщить службе о перехватах жизненного цикла.

 @Component(
...
)
export class ChildComponent implements OnInit, OnDestroy{
   constructor(private hookService: LifeCycleHookService){}

  ngOnInit(){
    this.hookService.fireHook(this, 'onInit');
  }

  ngOnDestroy(){
    this.hookService.fireHook(this, 'onDestroy');
  }
}
  

Надеюсь, это даст вам подсказку.

Комментарии:

1. Здравствуйте. У нас нет контроля над вводимыми компонентами. Мы не можем попросить их вызвать это.

2. О, понял. Тогда я не знаю, как это сделать.