Próbuję otoczyć głowę najlepszą praktyką podczas korzystania z Observables obok ChangeDetectionStrategy.OnPush
.ChangeDetectionStrategy.OnPush and Observable.subscribe w Angular 2
Przykład pokazuje wspólny scenariusz chcąc pokazać jakieś wiadomości ładunkowej (lub prostą animację pokrętła być może):
@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's success
Observable.of(true)
.delay(2000)
.subscribe(success => {
if(success){
console.log('Pretend loading: success!');
// OnPush won't detect this change
this.loadingMessage = 'Success!';
}
});
}
}
I mniej lub bardziej zrozumieć wymóg niezmienności z OnPush
i, przynajmniej dla mnie, ma to obecnie sens, gdy mówimy o rzeczywistych danych modelu (prawdopodobnie w jakimś sklepie).
Tak, mam dwa pytania:
- Dlaczego nie przypisanie nowej wartości ciągu
'Success!'
wyzwalają detektor zmiany? Jeśli chodzi o niezmienność, wartość się zmieniła, prawda? - W jaki sposób należy wdrożyć lekki składnik wewnętrzny składnika (np.
loadingMessage
) podczas korzystania zChangeDetectionStrategy.OnPush
? Jeśli istnieje wiele dobrych praktyk, wskaż mi właściwy kierunek.
Dziękujemy za wyczerpującą odpowiedź. Myślę, że najlepszym rozwiązaniem jest albo 'markForCheck()' (jestem graniczny, czy jest to trochę hacky, czy akceptowalne). Lub tworzenie wartości 'loadingMessage' lub' state' jako wartości 'Observable', dzięki czemu może reprezentować wiele stanów zgodnie z tym [plnkr] (http://plnkr.co/edit/OiBSDA8Kcsgl4vBF15xW?p=preview).Myślę, że dodam to do twojej odpowiedzi i zaakceptuję, ponieważ wydaje się, że obejmuje wszystkie podstawy. –
@PhilipBulley, 'markForCheck()' nie jest zhakowany. Dokument [ChangeDetectorRef API] (https://angular.io/docs/ts/latest/api/core/ChangeDetectorRef-class.html) pokazuje przykład bardzo podobny do twojego przypadku użycia: komponent z 'OnPush' ma' Właściwość numberOfTicks, która jest aktualizowana w wywołaniu 'setTimeout()', a funkcja 'markForCheck()' jest wywoływana w celu zapewnienia aktualizacji widoku. –
Dzięki za wyjaśnienie na przykładzie. –