Załóżmy, że chcę pobrać zestaw rekordów ze sklepu, wyświetlić je na liście, używając *ngFor
, np.Jak zbudować prawdziwą obserwowalną kolekcję za pomocą RxJS i Angular2?
<ul>
<li *ngFor="let record in records | async">
...
</li>
</ul>
Teraz użytkownik kliknie „” ... Nowy przycisk, kolejny rekord jest dodawany do sklepu i
recordAdded: EventEmitter<string>;
pożary mi powiedzieć o lokalizacji. Dostaję tę nową płytę - i tylko ten zapis - ze sklepu i ... okrzyki, jak mogę uzyskać mój *ngFor
, aby wyświetlić ten dodatkowy rekord?
Ok, więc mogę zachować wszystkie rekordy w tablicy, na przykład
_records: Record[];
i wypełnić tę tablicę poprzez zapisanie się na Observable<Record[]>
jak
this.recordService.getAll().subscribe(r => this._records = r);
Ale ta tablica musi być sama Observable
w celu powiadamiania konsumentów, gdy pojawi się nowy rekord. Więc
observableRecords = Observable.create(obs => {
this.recordService.getAll().subscribe(rec => {
this._records = rec;
obs.next(rec);
// Got the array published, now waiting for events
this.recordAdded.subscribe(rec => {
this._records.push(rec);
obs.next(this._records);
});
});
});
Uch ... Nie tylko jest to rozdzierający patrzeć, istnieje również mnóstwo napowietrznych jak cała tablica zostanie ponownie opublikowany za każdym razem nowy rekord jest dodawany i - najprawdopodobniej - kątowa 2 będzie odtwarzaj całą listę od zera na każdym kroku.
Ponieważ jest to taki powszechny scenariusz, wyobrażam sobie, że musi być o wiele lepszy sposób na zrobienie tego.