错误 TS2554:期望2个参数,但使用@ViewChild只传递了1个参数。

51

我之前是这样使用ViewChild的:

@ViewChild("InternalMedia") localStream;
@ViewChild("emoji") mEmoji;

在升级到angular-8.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;

它有效。我不明白"static"是什么意思,以及它应该具有哪个值才能像之前一样起作用?

2个回答

87

迁移到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;


23
根据Angular文档的静态检查,是否在变更检测运行之前解析查询结果(即仅返回静态结果)。如果未提供此选项,则编译器将返回其默认行为,即使用查询结果来确定查询解析的时机。如果任何查询结果位于嵌套视图中(例如*ngIf),则查询将在变更检测运行后解析。否则,它将在变更检测运行之前解析。
实际上,这决定了查询何时运行以检索元素。如果设置为false,则查询将在任何变更检测之后运行。如果设置为true,则立即运行。
有关更多信息以及包含此选项的原因,请参见此Github问题
您可能正在寻找的行为是将static设置为false。这将导致旧行为。但是,如果您的组件视图不是动态的(例如,您不使用*ngIf),则应该可以安全地将其设置为true。

4
他们不是说 Angular 2 之后所有内容都是向后兼容的吗? - ps0604
据我所知,没有。这个页面在文档中甚至讨论了重大变更以及如何处理它们。 - Mathyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接