错误TS2554:需要2个参数,但@ViewChild却有1个

时间:2019-06-06 08:43:26

标签: angular typescript angular7 viewchild angular8

我按如下方式使用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;

有效。我没有得到什么静态结果,像以前一样工作应该有什么价值?

2 个答案:

答案 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。