typescript - Angular 2 Async-pipe renderar inte nya värden med Observable
Jag använder NgRx Store i min app.
Hem.html
<list-objects
[array]="array| async"
(Edit)="Edit($event)"
(Delete)="Delete($event)"
></list-objects>
Home.ts
export class HomePage {
public array: Observable<itm[]>;
constructor(){
this.array= this.store.select(state => state.array);
this.array.subscribe((a) => {
console.log(a); //VALUES OK
}
}
Edit(event){
this.store.dispatch(this.actions.updateItem(event.item));
}
}
När jag redigerar ett element i en array uppdaterar inte async-pipen vyn, men värdena i "array"-objekten är korrekta (console.log inne i subscribe visar det uppdaterade värdet). När jag klickar någonstans i DOM (öppnar modal, klickar på knappar...) uppdateras vyn med de nya värdena.
Jag loggar också i barnkomponenten "ngOnChanges" och den utlöses inte med nytt värde.
Svar #1
Prova något liknande detta:
(Observera att denna kod inte är testad).
<list-objects
[array]="array"
(Edit)="Edit($event)"
(Delete)="Delete($event)"
></list-objects>
export class HomePage {
public array: itm[];
constructor( private zone:NgZone ){
this.store.select(state => state.array).subscribe((a) => {
this.zone.run(() => {
this.array = a;
});
}
}
Edit(event){
this.store.dispatch(this.actions.updateItem(event.item));
}
}
Jag har tagit bort async-pipen från mallen och tilldelat arrayen direkt. Genom att göra detta inuti this.zone.run kommer digest-cykeln att triggas och din mall kommer att återrenderas.
Digestcykeln utlöses normalt endast under ett antal fördefinierade omständigheter, t.ex. Http-metodens callback, UI-inmatning. Ingen av dessa inträffar här, så Angular vet inte att den ska uppdatera.
Svar #2
Försök :
constructor(private changeDetector: ChangeDetectorRef) {
this.array= this.store.select(state => state.array);
this.array.subscribe((a) => {
console.log(a); //VALUES OK
this.changeDetector.markForCheck();
}
}
