簡體   English   中英

使用來自 Parent 的 ViewChild 訪問嵌套在 ngTemplate 中的組件

[英]Access component nested in ngTemplate with ViewChild from Parent

你怎么知道延遲加載的組件是否已經被渲染? 我有以下 HTML:

<mat-accordion>
  <mat-expansion-panel>
    <mat-expansion-panel-header>
      Panel Summary
    </mat-expansion-panel-header>
    <ng-template matExpansionPanelContent>
      <some-component></some-component>
    </ng-template>
  <mat-expansion-panel>

  .... more panels with the same component

<mat-accordion>

默認情況下,面板是關閉的,所以<some-component>還沒有被渲染。

然后在 typescript 我有以下代碼:

@Component({
  selector: 'main-component',
  templateUrl: './main-component.html',
  style: ''
})
export class mainComponent implements OnInit {

  @ViewChild(SomeComponent, {static: false})
  someComponent: SomeComponent;

  onButtonClick() {
     this.someComponent.update();
  }

假設面板尚未打開並且用戶單擊按鈕我收到以下錯誤:

mainComponent.html: ERROR TypeError: Cannot read property 'update' of undefined

我知道這是因為實際組件尚未加載,我們正試圖調用它的 function。 我想保持延遲加載面板,以減少在 angular 材料擴展面板中具有動態事物的性能問題。

我只能想到一個解決方案,它不是延遲加載,這不是一個真正的選擇。 還有其他解決方案嗎? 有沒有辦法知道 ViewChild 是否未定義,或者是否有一個標志 viewChild 會告訴你它是否找到了這些組件?

如果您的組件實際上沒有加載,那么您怎么能期望調用它的更新呢? 什么是 SomeComponent?

我能想到你可以做的一件事是這樣的:

<mat-accordion>
  <mat-expansion-panel #someComponentExpansionPanel>
    <mat-expansion-panel-header>
      Panel Summary
    </mat-expansion-panel-header>
    <ng-template matExpansionPanelContent>
      <some-component [updateOnOpen]="updateOnOpen"></some-component>
    </ng-template>
  <mat-expansion-panel>

  .... more panels with the same component

<mat-accordion>

@Component({
  selector: 'main-component',
  templateUrl: './main-component.html',
  style: ''
})
export class mainComponent implements OnInit {

  @ViewChild(SomeComponent, {static: false})
  someComponent: SomeComponent;

  @ViewChild('someComponentExpansionPanel', {static: false})
  someComponentExpansionPanel: MatExpansionPanel;

  private _updateOnOpen = false;

  get updateOnOpen(): boolean {
    return this._updateOnOpen;
  }

  onButtonClick() {
     if ( this.someComponent ) {
       this.someComponent.update();
     } else {
       this._updateOnOpen = true;
       this.someComponentExpansionPanel.open();
     }
  }

您需要在 SomeComponent 中實現 updateOnOpen 輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM