在大多数情况下,您将需要使用{static: false}
。像这样设置它可以确保找到依赖于绑定分辨率的查询匹配(例如结构指令*ngIf, etc...
)。
何时使用的示例static: false
:
@Component({
template: `
<div *ngIf="showMe" #viewMe>Am I here?</div>
<button (click)="showMe = !showMe"></button>
`
})
export class ExampleComponent {
@ViewChild('viewMe', { static: false })
viewMe?: ElementRef<HTMLElement>;
showMe = false;
}
该static: false
会是在角9.读默认的备用行为更加这里和这里
{ static: true }
引入了该选项以支持动态创建嵌入式视图。当您动态创建视图并希望访问时TemplateRef
,您将无法执行操作,ngAfterViewInit
因为这会导致ExpressionHasChangedAfterChecked
错误。将static标志设置为true将在ngOnInit中创建视图。
不过:
在其他大多数情况下,最佳做法是使用{static: false}
。
请注意,尽管该{ static: false }
选项在Angular 9中将成为默认选项。这意味着不再需要设置静态标志,除非您要使用该static: true
选项。
您可以使用angular cli ng update
命令自动升级当前代码库。
有关迁移指南以及更多相关信息,可以在此处和此处进行检查
静态查询和动态查询有什么区别?
@ViewChild()和@ContentChild()查询的静态选项确定查询结果何时可用。
使用静态查询(static:true),查询将在创建视图后解决,但要在更改检测运行之前进行。但是,结果永远不会更新以反映对视图的更改,例如对ngIf和ngFor块的更改。
对于动态查询(静态:false),查询分别在ngAfterViewInit()或ngAfterContentInit()之后解析为@ViewChild()和@ContentChild()。结果将针对视图的更改而更新,例如对ngIf和ngFor块的更改。