51

我使用 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;

有用。我没有得到静态的作用以及像以前一样工作的价值是什么?

4

2 回答 2

86

迁移到 Angular 8 后,您应该手动声明它是否是静态的

@ViewChild(QuilldEditorComponent, {static: true}) quillEditorComponentInstance;

如果您还有其他问题可以询问他们或了解更多详细信息,请阅读此问题 https://github.com/angular/angular-cli/issues/14553 或查看官方文档 https://angular.io/guide/static -查询迁移

// query results available in ngOnInit
@ViewChild('foo', {static: true}) foo: ElementRef; 

OR

// query results available in ngAfterViewInit
@ViewChild('foo', {static: false}) foo: ElementRef;

于 2019-06-25T10:57:09.300 回答
23

根据 Angular 文档静态检查

是否在更改检测运行之前解析查询结果(即仅返回静态结果)。如果未提供此选项,编译器将退回到其默认行为,即使用查询结果来确定查询解析的时间。如果任何查询结果在嵌套视图中(例如 *ngIf),则查询将在更改检测运行后解析。否则,它将在更改检测运行之前解决。

这有效地确定了何时运行查询以检索元素。如果设置为 false,则查询将在检测到任何更改后运行。如果设置为 true,它将立即运行。

有关更多信息以及包含此选项的原因,请参阅此 Github 问题

您可能正在寻找的行为是设置static为 false。这将导致旧行为。但是,如果您的组件视图不是动态的(例如您不使用 *ngIf),您应该能够安全地将其设置为 true。

于 2019-06-06T08:53:54.993 回答