Как вызвать метод в большом дочернем компоненте

#angular #typescript #angular9

#angular #typescript #angular9

Вопрос:

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

Большой родительский компонент

 <div class="col text-right">
            Show Values:
            <ejs-switch
              class="form-control form-control-sm"
              (change)="displayGrillsValue($event)"
              [checked]=true
            ></ejs-switch>
        </div>

    <div class="row">
            <div class="col">
              <div class="ContentControl">
                <app-grills-kpi [isInEdit]="isInEdit" [maxWidth]="'450px'" [maxHeight]="'30px'" [controlName]="ControlName.GrillsKPI1"></app-grills-kpi>
              </div>
            </div>
            <div class="col">
              <div class="ContentControl">
                <app-grills-kpi [isInEdit]="isInEdit" [maxWidth]="'450px'" [maxHeight]="'30px'" [controlName]="ControlName.GrillsKPI2"></app-grills-kpi>
              </div>
            </div>
          </div>
  

Родительский компонент :

 <app-grills-kpi-chart #chart [grillsKPIModel]="grillsKPIModel" [exportName]="formattedKPIName">
        </app-grills-kpi-chart>
  

Большой дочерний компонент :

Это метод, который я хочу вызвать

 displayGrillsValue = ($event) => {
    this.chart.visibleSeries.forEach(element => {
      if($event.checked){
        element.marker = this.marker;
      }else {
      element.marker.dataLabel.visible =  $event.checked;
      }
    });
    this.chart.refresh();
  }
  

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

Ответ №1:

вы можете использовать BehaviorSubject или Subject для запуска вызова функции

TriggerService.ts

 @Injectable()
export class TriggerService{
  constructor(){}
  private _trigger = new BehaviorSubject<string>('');
  castTrigger = this._trigger.asObservable();
  
  trigger(){
    this._trigger.next(''); 
  }
}
  

parent.component.ts

   constructor(private triggerService: TriggerService){}

  displayGrillsValue(){
      this.triggerService.trigger();
  }
  

child.component.ts

 constructor(private triggerService: TriggerService){}

ngOnInit(){
    this.triggerService.castTrigger.subscribe(data => // grand child component logic here);
}
  

демонстрация stackblitz

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

1. но в этом случае как мне вызвать большой дочерний компонент и обновить обе диаграммы? Нужно ли мне напрямую вызывать службу в большом дочернем компоненте?

2. нет, вы можете запустить метод дочернего компонента из родительского, потому что дочерний элемент подписан на эту тему.. пожалуйста, посмотрите демонстрацию stackblitz

3. я думаю, что в вашем примере это только родительский дочерний элемент, но в моем у меня тоже есть великий родитель, так что в этом случае, как сделать

4. это не имеет значения, у вас может быть n дочерних компонентов, если дочерние компоненты подписаны на эту тему

5. понял, вы имеете в виду, что в моем большом дочернем компоненте я могу подписаться на эту тему, я прав?