我按如下方式使用ViewChild:
@ViewChild("InternalMedia") localStream;
@ViewChild("emoji") mEmoji;
直到angular-7.x都可以正常工作
当我将其升级到angular-8.x时,它开始出现以下错误
.../call_emoji/component.ts(41,4): error TS2554: Expected 2 arguments, but got 1.
我选中了https://angular.io/api/core/ViewChild,并将其更改为
@ViewChild("InternalMedia",{static:false}) remoteStream;
有效。我没有得到什么静态结果,像以前一样工作应该有什么价值?
答案 0 :(得分:15)
迁移到Angular 8后,您应该手动声明它是否是静态的
@ViewChild(QuilldEditorComponent, {static: true}) quillEditorComponentInstance;
如果您还有其他问题要询问,或者需要更多详细信息,请阅读本期 https://github.com/angular/angular-cli/issues/14553 或查看官方文档 https://angular.io/guide/static-query-migration
// query results available in ngOnInit
@ViewChild('foo', {static: true}) foo: ElementRef;
OR
// query results available in ngAfterViewInit
@ViewChild('foo', {static: false}) foo: ElementRef;
答案 1 :(得分:7)
根据Angular文档的静态检查
在更改检测运行之前是否解析查询结果(即仅返回静态结果)。如果未提供此选项,则编译器将退回到其默认行为,即使用查询结果来确定查询解析的时间。如果任何查询结果在嵌套视图内(例如* ngIf),则在运行更改检测后将解决查询。否则,将在运行更改检测之前解决该问题。
这有效地确定了何时运行查询以检索元素。如果设置为false,则查询将在检测到任何更改后运行。如果设置为true,它将立即运行。
有关更多信息以及为何包含此选项的信息,请参见this Github issue。
您可能正在寻找的行为是将static
设置为false。这将导致旧的行为。但是,如果组件的视图不是动态的(例如,您不使用* ngIf),则应该可以安全地将其设置为true。