【发布时间】:2020-04-02 08:26:18
【问题描述】:
我不太明白为什么我需要在下面的代码中添加 markForCheck() 以使更改可见。为什么我的 @Input() 没有触发更改检测?
我正在将我的项目重构为 OnPush。这两个组件都启用了 OnPush。据我了解,当启用此功能并更改 Input()(如 messages)时,将触发更改检测。
在下面的代码中,我通过graphqlService 拨打电话。当我接到电话时,我会对传入的数据进行一些解析,然后将其设置为informationMessages 属性,该属性通过其messages 属性绑定到子组件cv-messages。
结果是ngOnChanges 函数只被调用一次,此时informationMessages 属性被初始化。但不是当最终解析的数据设置为它时。
如果我添加 markForCheck() 就可以了。
考虑这个父组件,模板如下:
<cv-messages [messages]="informationMessages"></cv-messages>
还有一个带有这段代码的打字稿文件:
informationMessages: InformationMessageType[] = [];
ngOnInit() {
this.graphqlService.loadInformationMessages().subscribe(data => {
const informationMessages: InformationMessageType[] = data;
.... // parsing stuff
this.informationMessages = informationMessages;
// add markForCheck() here
});
}
messages 组件有一个这样的 ngOnChanges 函数:
ngOnChanges(changes) {
console.log(this.constructor.name ' CHANGE:', changes);
}
更新:
您可以在下面的答案的 cmets 中找到解决方案。基本上,当 @Input() 异步更改时,不会触发更改检测。所以在这种情况下,我们需要添加一个markForCheck() 来强制进行更改检测。
【问题讨论】:
标签: angular data-binding angular2-changedetection