ChangeDetectionStrategy.OnPush和Observable.subscribe在Angular 2中。
ChangeDetectionStrategy.OnPush和Observable.subscribe在Angular 2中。
我试图理解在使用Observables和ChangeDetectionStrategy.OnPush
时的最佳实践。
这个示例展示了一个常见的场景,即想要显示某种加载消息(或者简单的旋转动画):
@Component({ selector: 'my-app', template: `我们正在加载中吗?:{{loadingMessage}}`, // 显然,“Default”会注意到`loadingMessage`的变化... // 但是在使用OnPush时,最佳实践是什么? changeDetection: ChangeDetectionStrategy.OnPush }) export class App implements OnInit { private loadingMessage = "请稍候..."; constructor() { } ngOnInit() { // 假装我们正在从服务中加载数据。 // 这个组件只关心调用是否成功 Observable.of(true) .delay(2000) .subscribe(success => { if(success){ console.log('假装加载:成功!'); // OnPush不会检测到这个变化 this.loadingMessage = '成功!'; } }); } }
我或多或少地理解了在使用OnPush
时对不可变性的要求,至少对我来说,当谈到实际的模型数据(可能保存在某种存储中)时,这是有道理的。
所以,我有两个问题:
- 为什么给新的字符串值
'Success!'
赋值不会触发变更检测器?就不可变性而言,值已经发生了变化,对吗? - 在使用
ChangeDetectionStrategy.OnPush
时,应该如何实现轻量级的内部组件状态(例如loadingMessage
)?如果有多个最佳实践,请指点我正确的方向。