以下是我在onPush变化检测策略上的不足之处 . 如果发生以下任一情况,则触发OnPush更改检测
-
在组件上收到绑定事件 .
-
输入已更新 .
-
Async
管道收到了一个事件 . -
手动调用更改检测 .
从上面的列表中, An input was updated
必须是引用更改,因此输入必须是不可变的 .
这是我的情景 .
我有父组件 Parent
,我订阅了一个observable来从API调用中获取数据,我通过 @Input
将这些数据传递给子组件 .
Parent Component
@Component({
template: '<child-component [data]="data"></child-component>'
})
export class ParentComponent implements OnInit {
this.dataService.get().subscribe(data => {this.data = data})
}
Child Component
@Component({
selector: 'child-component',
template: '{{data.name}}',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent {
@Input() data;
constructor() {
console.log(this.data)
// undefined, because the data is async response and not available while bootstrapping.
}
ngAfterContentChecked() {
console.log(this.data) // available
}
}
这里的问题是,如果我们将 onPush
更改检测策略添加到子组件并且输入引用未更改,则更改不会从父级传播到子级 . 原因是 onPush
策略期望输入是不可变的 . 如何克服这种情况?
任何帮助是极大的赞赏 .
Update
在谷歌搜索我发现blog post由 Victor Savkin
如果组件仅依赖于其输入属性,并且它们是可观察的,则当且仅当其中一个输入属性发出事件时,此组件才能更改 .
那么我们可以将 observables
传递给输入并修复它吗?如果是,请提出有效的解决方案 .
请注意,我不想在模板中使用 asyn
管道或手动触发更改检测 .