typescript - I Angular, hva betyr *ngFor="let item from list | async"?
Dette brukes i dette kodeeksemplet https://stackblitz.com/angular/jdamnnmgrae?file=app%2Fautocomplete-overview-example.ts.
Kodeutdraget det gjelder er:
<mat-option *ngFor="let state of filteredStates | async" [value]="state.name">
Jeg har ennå ikke sett denne syntaksen, så jeg er forvirret over hva den gjør. Når jeg fjerner det asynkrone kallet, fungerer ikke koden lenger, så jeg trenger å forstå det.
Min oppfatning er at denne koden lager en liste over Observables som blir sendt til async-pipen, men jeg har ikke sett hvor dette er dokumentert i Angulars dokumentasjon. Hvis du vet, vennligst svar.
import {map} from 'rxjs/operators/map';
export class AutocompleteOverviewExample {
// . . . other stuff omitted
filteredStates: Observable<any[]>;
constructor() {
this.filteredStates = this.stateCtrl.valueChanges
.pipe(
startWith(''),
map(state => state ? this.filterStates(state) : this.states.slice())
);
Så, for-løkken går sannsynligvis gjennom Observables fordi Async-pipen tar en Promise eller Observable, og det er ikke en Promise. :-)
Nyttige lenker:
https://angular.io/api/common/AsyncPipe
https://angular.io/guide/rx-library - for map, filter
https://angular.io/api/forms/FormControl for FormControl.valueChanges
https://angular.io/guide/observables
Jeg har ikke vært i stand til å finne ut hvordan pipe brukes fra FormControl.valueChanges, men forhåpentligvis vil dette bli klart når dette spørsmålet blir besvart.
(Q) Kan noen vise meg litt Angular-dokumentasjon som forklarer hva syntaksen «*ngFor | async» betyr? Eller gi en forklaring.
Søk etter svar viste disse resultatene
Bruke et array fra Observable Object med ngFor og Async Pipe Angular 2 - Jeg tror spørsmålet jeg har er likt, men jeg leste det svaret, og det var ingen forklaring, bare et kodeeksempel.
Bruk async-pipe i ngFor på Observable av Observables (Angular) - Mer syntaks jeg ikke forstår.
https://blog.thoughtram.io/angular/2017/02/27/three-things-you-didnt-know-about-the-async-pipe.html - Dette ser ut som svaret på spørsmålet mitt. Men siden jeg har brukt så mye tid på å skrive det, vil jeg fortsatt legge det ut.
Svar #1
Syntaksen let state of filteredStates | async kan betraktes som dette:
let state of (filteredStates | async)
async-pipe brukes på filteredStates-variabelen og ikke på hele for-løkken.
Jeg tror det bør være åpenbart etter å ha sett på alle de andre ressursene du har sett på, men async-pipe er nyttig fordi den vil abonnere på observablen for deg (og i tillegg rydde opp i abonnementet slik at du ikke trenger å bekymre deg for å avslutte abonnementet).
Så det som skjer er at Angular abonnerer på ditt filteredStates observable. Hver gang en ny liste sendes fra ditt observable, vil Angular *ngFor-direktiv gå gjennom den listen som ble sendt.
Uten async-pipen måtte du bare abonnere på din filteredStates-observable i komponenten din og lagre listen som en egenskap på komponenten (som du deretter ville gått gjennom i stedet for filteredStates | async). Merk: Det finnes et par måter å håndtere avslutning av abonnement på, dette er bare én måte.
<mat-option *ngFor="let state of filteredStates" [value]="state.name">
class AutocompleteOverviewExample {
filteredStates: State[] = [];
subscription: Subscription = null;
constructor() {
this.subscription = this.stateCtrl.valueChanges
.pipe(
startWith(''),
map(state => state ? this.filterStates(state) : this.states.slice())
)
.subscribe(states => this.filteredStates = states);
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = null;
}
}
}
