Значения патчей массива Angular 6 Form при изменении значений

Ниже мой FormArray, я хотел бы обновить один ввод на основе изменения значения на другом входе. Всякий раз, когда пользователь меняет продукт, служба получает цену и taxPercent, которые необходимо исправить для этого индекса в массиве форм, и когда количество добавлено, я хотел бы исправить totalAmount. Это было легко, когда это была просто formControlElements, подписавшись на соответствующие valueChanges и указав соответствующие поля. Как я могу сделать то же самое в FormArray?

<div formArrayName="products" *ngFor="let product of productsArray.controls; let i=index">
      <div [formGroupName]="i">
          <div class="form-row">

              <div class="form-group col-md-4">
                  <label for="product">Product</label>
                  <select formControlName="pdt"  class="form-control" >
                      <option [value]="pdt.productPriceId" *ngFor="let pdt of productPrice">{{pdt.productName}}  -  {{pdt.size}}</option>
                  </select>
              </div>

              <div class="form-group col-md-1">
                <label for="price">Price</label>
                <input type="text" class="form-control" formControlName="price" id="price">
              </div>
              <div class="form-group col-md-1">
                <label for="taxPercent">Tax %</label>
                <input type="text" class="form-control" formControlName="taxPercent" id="taxPercent">
              </div>

              <div class="form-group col-md-1">
                <label for="quantity">Qty</label>
                <input type="text" class="form-control" formControlName="quantity" id="quantity">
              </div>

              <div class="form-group col-md-1">
                <label for="totalAmount">Amt</label>
                <input type="text" class="form-control" formControlName="totalAmount" id="totalAmount">
              </div>

            <div class="form-group col-md-1">
                <span>
                  <button class="btn btn-primary" (click)=addProduct()>Add</button>
                </span>
            </div>
            <div class="form-group col-md-1">
              <span>
                <button class="btn btn-primary" (click)=removeProduct(i)>Remove</button>
              </span>
          </div>
        </div>
      </div>
    </div>

Подписка My Value Changes для FormControl выглядит так, как показано ниже. Но я не уверен, как сделать то же самое для FormArray

this.billingForm.get('products[0].pdt').valueChanges.subscribe(
      (value) => {

          console.log(value);
          let taxPercentVal: Number = 0;
          let priceVal: Number = 0;
          this.productPrice.forEach(function (val) {
            if(value == val.productPriceId)
            {
              taxPercentVal = val.taxPercent;
              priceVal = val.price;
            }
          });

          this.billingForm.patchValue({
            products: {
              taxPercent: taxPercentVal,
              price: priceVal,
              quantity: '',
              totalAmount: '' 
            }
          })



      }
    );



    this.billingForm.get('products.quantity').valueChanges.subscribe((value) => {
          console.log(value);
          let taxPer = this.billingForm.value.products.taxPercent;
          console.log(taxPer);
          let pr = this.billingForm.value.products.price;
          console.log(pr);
          let qty = value;
          console.log(qty);
          let totAmt = (pr * qty) + ((pr * qty) / taxPer);
          console.log(totAmt);
          this.billingForm.patchValue({
            products: {
              totalAmount: totAmt
            }
          })
    })

person Muthaiah PL    schedule 16.10.2018    source источник


Ответы (1)


вы можете добавить функцию в свое событие изменения. Что-то вроде ниже:

<div class="form-group col-md-4">
                  <label for="product">Product</label>
                  <select formControlName="pdt"  class="form-control" **(change)="onChange($event)"** >
                      <option [value]="pdt.productPriceId" *ngFor="let pdt of productPrice">{{pdt.productName}}  -  {{pdt.size}}</option>
                  </select>
</div>

Вы должны иметь возможность фиксировать новый продукт и обновлять остальные поля с помощью привязки данных. Надеюсь, это поможет!

person alokstar    schedule 16.10.2018
comment
Большое спасибо. Можете ли вы также добавить фрагмент кода для метода onChange. Я не уверен, как выполнить привязку данных для элементов FormArray. - person Muthaiah PL; 16.10.2018
comment
Боюсь, я не могу дать вам точную функцию, так как у меня нет вашего полного кода. Но я могу дать вам логику того, что нужно сделать. Напишите функцию onChange (событие) в свой файл component.ts. Вы можете передать объект продукта в функцию onChange, так что теперь у вас есть, какой продукт выбран в вашем контроллере (component.ts). Как только вы узнаете, какой новый продукт выбран, остается только обновить представление, чего можно добиться с помощью простых привязок данных. Если вы хотите лучше понять привязку данных, вам может помочь следующая статья: angular.io/guide/form-validation - person alokstar; 16.10.2018
comment
Это сработало. Спасибо. PatchValues ​​по-прежнему работают с formArrays - person Muthaiah PL; 16.10.2018
comment
ваше решение не работает с массивом форм. если у меня есть 2 или 3 варианта выбора, то как только я изменю вариант выбора значения, другой вариант выбора также изменится. - person Manish; 16.10.2019