以下是我在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 postVictor Savkin

如果组件仅依赖于其输入属性,并且它们是可观察的,则当且仅当其中一个输入属性发出事件时,此组件才能更改 .

那么我们可以将 observables 传递给输入并修复它吗?如果是,请提出有效的解决方案 .

请注意,我不想在模板中使用 asyn 管道或手动触发更改检测 .