【问题标题】:How to call an method in grand child component如何在大子组件中调用方法
【发布时间】:2020-11-18 05:50:23
【问题描述】:

我有嵌套组件。当我在祖父组件中按下切换时,我想在孙子组件中调用一个方法。

祖父组件

<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 个图表。因此,当我按下切换按钮时,我希望图表都可以通过大子方法刷新。

【问题讨论】:

    标签: angular typescript angular9


    【解决方案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 demo

    【讨论】:

    • 但在此我如何调用大子组件并刷新两个图表?我需要直接调用大子组件中的服务吗?
    • 不,您可以从父级触发子组件方法,因为子级订阅了该主题.. 请参阅 stackblitz 演示
    • 我认为在您的示例中它只是父子,但在我的示例中我也有祖父,所以在这种情况下该怎么做
    • 没关系,你可以有n个子组件,只要子组件订阅了那个主题
    • 知道了,所以您的意思是在我的大子组件中我可以订阅该主题,对吗?
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2021-05-02
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2020-06-15
    相关资源
    最近更新 更多