Возвращает результат наблюдаемого с помощью combineLatest и Rxjs

#angular #typescript #rxjs #observable

#angular #машинописный текст #rxjs #наблюдаемый

Вопрос:

Я хочу получить результат наблюдаемого, который вычитает значение по умолчанию при каждом изменении значения

Каждый раз, когда значение изменяется, оно вычитает значение по умолчанию на новое значение, введенное в поле ввода

Например, значение по умолчанию равно 5.

Я ввожу 4 в поле ввода

Результат 5-4 = 1, поэтому я хочу отобразить 1 в поле ввода «Площадь поверхности».

Я очищаю поле, затем ввожу 3, результат 5-3 = 2, поэтому я хочу отобразить 2 в поле ввода «Поверхность ha».

И так далее ….

Если я создам консоль.журнал Я могу четко видеть результат наблюдаемого, но я хочу отобразить результат наблюдаемого в том же поле ввода

Я получаю только такой результат ошибки в моей консоли разработчика:

NaN

Вид из окна:

    <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>
 

Внутри компонента:

     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;
 

Ответ №1:

Вам нужно присвоить значения, передаваемые наблюдаемым this.surface , а не самой подписке:

 resSurface.subscribe(val => this.surface = val);
 

В качестве альтернативы, вы можете избавиться от subscribe вызова и использовать угловой async канал для привязки непосредственно к наблюдаемому:

 this.resSurface = combineLatest(observedValues)
                    .pipe(map(([value0, value1, value2]) => { return this.surface - (value0   value1   value2) }));
 

А затем в вашем шаблоне:

 <input matInput type="number" [value]="resSurface | async" placeholder="Libellé" formControlName='surface'>
 

Комментарии:

1. Мне жаль, что я плохо объяснил, я хочу повторно использовать значение «res», чтобы отобразить его в представлении формы

2. Ах, я думаю, я понимаю — я отредактировал свой ответ.

3. resSurface.subscribe(val => this.surface = val); переопределите this.surface но я хочу вернуть результат наблюдаемого, а не переопределять this.surface в сам наблюдаемый

Ответ №2:

Я забыл начать с другого значения по умолчанию!

             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;