Я пытаюсь склонить голову к лучшей практике при использовании Observables рядом с ChangeDetectionStrategy.OnPush
.
В примере демонстрируется общий сценарий, требующий показать какое-либо загрузочное сообщение (или, возможно, просто анимацию spinner):
@Component({
selector: 'my-app',
template: `Are we loading?: {{loadingMessage}}`,
// Obviously "Default" will notice the change in `loadingMessage`...
// changeDetection: ChangeDetectionStrategy.Default
// But what is best practice when using OnPush?
changeDetection: ChangeDetectionStrategy.OnPush
})
export class App implements OnInit {
private loadingMessage = "Wait for it...";
constructor() {
}
ngOnInit() {
// Pretend we're loading data from a service.
// This component is only interested in the call success
Observable.of(true)
.delay(2000)
.subscribe(success => {
if(success){
console.log('Pretend loading: success!');
// OnPush won't detect this change
this.loadingMessage = 'Success!';
}
});
}
}
Я более или менее понимаю требование неизменности с OnPush
, и, по крайней мере, для меня это имеет смысл, когда речь идет о фактических данных модели (вероятно, хранится в каком-то магазине).
Итак, у меня есть два вопроса:
- Почему назначение нового строкового значения
'Success!'
не запускает детектор изменений? Что касается неизменности, значение изменилось, правильно? - Как должно быть реализовано легкое внутреннее состояние компонента (т.е.
loadingMessage
) при использованииChangeDetectionStrategy.OnPush
? Если есть несколько лучших практик, пожалуйста, укажите мне в правильном направлении.