情境
當 angular 裡的 範本變數裡使用到 ngIf,在執行範本變數的時後會報錯,出現 undefined,無法操控
程式碼如下
html
<app-child *ngIf="isShow" #child></app-child>
component
export class AppComponent {
@ViewChild('child') childElement: any;
isShow: boolean;
updatChild(): void {
this.isShow = !this.isShow;
}
}
原因
使用 ngIf 時,一開始執行 ngOnInit
,這個 dom 是不存在的,所以去操控這個 dom 的時後 就會報錯
解決方式
-
使用
ChangeDetectorRef
再次偵測 dom 因為ViewChild
在只會執行一次,所以當 ngIf 條件變更為 true 的時後 不會重新抓取 dom, 這時後可以注入ChangeDetectorRef
透過裡面的detectChanges
方式,去偵測 dom 是不是有變更過,若是有變更的話ViewChild
會再進行抓取 -
不使用 ngIf 改用 hidden 在 Angular 裡 有提供
[hidden]
這個屬性,它在 html 裡是屬display: none
所以 dom 是存在的 只是被隱藏,所以一開始ViewChild
就能取得範本變數
範例: https://stackblitz.com/edit/angular-viewchild-undefined-ngif