angular - Palauta observablen tulos combineLatestin ja Rxjs:n avulla
Haluan saada havaittavan tuloksen, joka vähentää oletusarvon joka kerta, kun arvo muuttuu
Joka kerta, kun arvo muuttuu, se vähentää oletusarvosta syötetyn uuden arvon syöttökenttään.
Esimerkiksi oletusarvo on 5.
Syötän 4 syöttökenttään
Tulos on 5-4=1, joten haluan näyttää 1 syöttökentässä "Pinta-ala ha"
Tyhjennän kentän, sitten syötän 3. Tulos on 5-3=2, joten haluan näyttää 2 syöttökentässä "Pinta-ala ha"
Ja niin niin ....
Jos teen console.login, näen selvästi havaittavan tuloksen, mutta haluaisin näyttää havaittavan tuloksen samaan syöttökenttään
Saan tämän tyyppisen virhetuloksen vain kehittäjäkonsolissani:
Ei numero
Näkymä:
<form [formGroup]="credentialsForm" *ngIf="credentialsForm">
<mat-form-field class="example-full-width">
<mat-label>Surface Ha</mat-label>
<input matInput type="number" [value]="surface" placeholder="Libellé" formControlName='surface'>
</mat-form-field>
<ion-input class="form-control" placeholder="Valeur"
formControlName="0">
</ion-input>
</form>
Komponentin sisällä:
this.surface = 5;
const observedValues = ['0']
.map(key => this.credentialsForm.controls[key].valueChanges.map(value => +value).startWith(0))
const resSurface = combineLatest(observedValues)
.pipe(map(([value0]) => { return this.surface - value0 }));
const res = resSurface.subscribe(val => { return val });
// These line below should display the "res" value
this.surface = res;
Vastaus #1
Sinun täytyy osoittaa Observablen tuottamat arvot this.surface -muuttujalle, eikä itse tilaukselle:
resSurface.subscribe(val => this.surface = val);
Vaihtoehtoisesti voit poistaa subscribe-kutsun ja käyttää Angularin async-putkea sitomaan suoraan Observablen:
this.resSurface = combineLatest(observedValues)
.pipe(map(([value0, value1, value2]) => { return this.surface - (value0 + value1 + value2) }));
Ja sitten mallissasi:
<input matInput type="number" [value]="resSurface | async" placeholder="Libellé" formControlName='surface'>
Vastaus #2
Unohdin aloittaa eri oletusarvolla!
let defaultValueSurface = 5;
const observedValues = ['0']
.map(key => this.credentialsForm.controls[key].valueChanges.map(value => +value).startWith(0))
const resSurface = combineLatest(observedValues)
.pipe(map(([value0]) => { return defaultValueSurface - value0 }));
const res = resSurface.subscribe(val => { return val });
this.surface = res;
