Angular 角度v8-@ViewChild静态正确或错误

Angular 角度v8-@ViewChild静态正确或错误,angular,angular8,viewchild,Angular,Angular8,Viewchild,角度v8刚刚发布。虽然它主要是向后兼容的,但也有一些突破性的变化 根据Angular的一个核心变化是(我引用): 在Angular版本8中,要求所有@ViewChild和@ContentChild查询都有一个“静态”标志,指定查询是“静态”还是“动态” 它还指出,在大多数情况下,只需设置{static:false}即可 @ViewChild('selectorName', { static: false }) varName: any; 我的问题是何时应该将此属性(静态)设置为true?它将如

角度v8刚刚发布。虽然它主要是向后兼容的,但也有一些突破性的变化

根据Angular的一个核心变化是(我引用):

在Angular版本8中,要求所有@ViewChild和@ContentChild查询都有一个“静态”标志,指定查询是“静态”还是“动态” 它还指出,在大多数情况下,只需设置
{static:false}
即可

@ViewChild('selectorName', { static: false }) varName: any;

我的问题是何时应该将此属性(静态)设置为
true
?它将如何影响我的申请???

来自文档:

如何选择要使用的静态标志值:true或false

在 官方API文档,我们一直建议检索查询结果 在ngAfterViewInit中用于查看查询,在ngAfterContentInit中用于内容查询 查询。这是因为当这些生命周期钩子运行时,更改 相关节点的检测已经完成,我们可以保证 我们已经收集了所有可能的查询结果

大多数应用程序都希望使用{static:false}来处理相同的问题 原因。此设置将确保查询匹配依赖于 约束分辨率(例如*NGIF或*ngFors内的结果)将 由查询找到

很少有需要{static:true}标志的情况 (见这里的答案)


当您想要访问
ngOnInit
中的
ViewChild
时,请使用
{static:true}

使用
{static:false}
只能在
ngAfterViewInit
中访问。当模板中有结构指令(
*ngIf
等)时,这也是您要执行的操作

在大多数情况下,
{static:false}
将起作用

从'@angular/core'导入{Component,OnInit,AfterViewInit,ViewChild,ElementRef};
@组成部分({
选择器:“示例”,
templateUrl:'./example.component.html',
样式URL:['./example.component.scss']
})
导出类ExampleComponent实现OnInit,AfterViewInit
{
@ViewChild('elementA',{static:true})elementStatic:ElementRef;
@ViewChild('elementB',{static:false})elementDynamic:ElementRef;
public ngOnInit():void
{
this.elementStatic.nativeElement;//确定
this.elementDynamic.nativeElement;//错误类型错误:无法读取未定义的属性“nativeElement”
}
public ngAfterViewInit():void
{
this.elementStatic.nativeElement;//确定
this.elementDynamic.nativeElement;//确定
}
}
A

B
谢谢,但请你写一个答案,并解释一下。我想纠正的是,对于
@ContentChild
的情况,在
ngAfterContentInit
中可以找到非静态的@ViewChild比新的@ViewChild有什么缺点?我觉得上一篇比今天的更新更有用