Как вызвать ngOnInit компонента из другого компонента

#angular #behaviorsubject

#angular #behaviorsubject

Вопрос:

Я хочу вызвать ngOnInit() компонента из другого компонента, поэтому я использую BehaviorSubject для этого.

У меня есть компонент A, который является компонентом панели навигации, поэтому он вызывается в начале приложения, и другой компонент B. Я хочу перезагружать ngOnInit компонента A каждый раз, когда я выполняю функцию в компоненте B.

Это компонент A :

 export class A implements OnInit {
 isDisabled : boolean ;
 client : any;
constructor(private draftDataService : DraftDataService) {
  this.draftDataService.getClient().subscribe( data =>  {this.client=data ; 
  })
 }
ngOnInit() {
  
      if(this.client)
      {  
        this.isDisabled = false;
      }
        else {
          this.isDisabled=true;
        }
      }}
 

И это компонент B :

  export class B implements OnInit, OnDestroy {
   generalInfomodel : GeneralInfoModel= new GeneralInfoModel();
   public selectedClient: ItemClientModel;
   constructor(private draftDataService : DraftDataService){}
   ngOnInit() {}
   selectClient(e: any) {
     if (e) {
         this.selectedClient = e ;
         this.generalInfomodel.client = this.selectedClient;
         this.draftDataService.sendClient(this.generalInfomodel.client);
      }}
       }
 

И это сервис :

 export class DraftDataService {
 constructor() { }
  private subjectClient = new BehaviorSubject<any>('');
  sendClient( client : ItemClientModel){
     this.subjectClient.next(client);
   }
  getClient() : Observable<ItemClientModel>{
    return this.subjectClient.asObservable();
   }}
 

Проблема в том, что компонент A загружается в начале, поэтому он получает пустую строку ‘Client’, и когда выполняется функция ‘selectClient’ в компоненте B, компонент A не получил ее, я не знаю почему! Я имею в виду, когда я утешаю клиента в компоненте A, он отображается только один раз с неопределенным значением! Кто-нибудь может помочь мне решить эту проблему?

Ответ №1:

Короткий ответ — использовать ViewChild для вызова функции в компоненте B.

В вашем HTML-шаблоне дайте ComponentB имя:

 <app-componentb #componentb></app-componentb>
 

В родительском компоненте ComponentB сделайте что-то вроде этого:

 @ViewChild(componentB) componentB: ComponentB
 

А затем в родительском компоненте ComponentB вы можете сделать это:

 componentB.ngOnInit()
 

Обычно я бы не вызывал подобные методы иерархии компонентов Angular, если только это не было частью модульного теста. Я бы поместил эту функциональность в другой метод, который вызывается как из ngOnInit(), так и из внешних методов.

Если ComponentA не является родителем ComponentB, все немного сложнее.

Если они являются братьями и сестрами одного и того же родителя, вы можете отправить событие из ComponentA, чтобы сообщить родителю о сбросе ComponentB.

Или, если у вас другая архитектура, вы можете поместить наблюдаемый объект в службу, которая является общей как для ComponentA, так и для ComponentB. ComponentA запустит a next() , а ComponentB подпишется на принудительное изменение.

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

1. Спасибо за ответ, но в моем случае компоненты A и B не относятся к родительско-дочерним, поэтому я использовал BehaviorSubject, но это не сработало

2. На бумаге тема — это правильный путь, но мне нужен доступный для выполнения образец, чтобы понять, почему он не работает для вас.