Angular Material mat-select в FormArray и formGroup

У меня есть группа форм, которая содержит 2 мат-выбора и поле ввода. В первой группе я выбираю значение из первого выбора мата, и, соответственно, второй выбор мата заполняется данными для этого выбранного значения из первого выбора мата. Затем я выбираю значение из второго мат-выбора, а затем ввожу значение в третий элемент управления, который является простым вводом. Затем я нажимаю кнопку, чтобы добавить еще одну группу форм, теперь, когда я выбираю значение из первого мат-выбора, значение второго мат-выбора в предыдущем групповом массиве исчезает из поля зрения, но когда я проверяю значения формы, он есть. Я не понимаю, что вызывает это событие. Может кто-нибудь, пожалуйста, помогите мне найти причину и решить проблему.

<div formArrayName = "rawmaterialwh">
                <div [formGroupName] = "i" *ngFor = "let product of products.controls; let i=index">
                   <legend>{{i+1}}</legend>
                     <div class = "form-group row">
                      <div fxLayout = "row wrap" fxLayoutAlign = "space-between center">
                         <mat-form-field>
                            <mat-select formControlName = "supplier" class = "form-control"
                               (selectionChange) = "onSupplierValueChange($event)" placeholder = "Supplier">
                               <mat-option disabled selected hidden>Supplier</mat-option>
                               <mat-option *ngFor = "let supplier_mode of supplierOption"
                                  [value] = "supplier_mode.supplierid">{{supplier_mode.name}}</mat-option>
                            </mat-select>
                         </mat-form-field>
                      </div>
                   </div>
                   <div class = "form-group row">
                      <div fxLayout = "row wrap" fxLayoutAlign = "space-between center">
                         <mat-form-field>
                            <mat-select formControlName = "rawmaterialid" class = "form-control" placeholder = "Raw Material"
                               (selectionChange) = "onProductValueChange($event)">
                               <mat-option disabled selected hidden>Product</mat-option>
                               <mat-option *ngFor = "let product_mode of productOption"
                                  [value] = "product_mode.rawmaterialid">{{product_mode.rawmaterialname}}</mat-option>
                            </mat-select>
                         </mat-form-field>
                         <div fxFlex.gt-sm = "49" fxFlex.gt-xs = "49" fxFlex = "100">
                            <mat-form-field class = "full-wid mrgn-b-md">
                               <input matInput placeholder = "Quantity" formControlName = "qty" id = "{{ 'qty' + i }}">
                            </mat-form-field>
                         </div>
                         <button *ngIf = "!_isUpdating" class = "mrgn-all-xs" class = "mrgn-all-xs" mat-mini-fab color = "warn"
                            (click) = "deleteProduct(i)">
                            <mat-icon>delete</mat-icon>
                         </button>
                      </div>
                   </div>
                </div>
             </div>

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
2 266
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что вы используете одну и ту же переменную для всего второго выбора мата (вам нужно использовать массив).

Итак, представьте, что вы определяете

productOption:any[]=[];

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

<mat-select formControlName = "supplier"
            (selectionChange) = "onSupplierValueChange($event,i)">

onSupplierValueChange(suplierId,index){
   //I imagine you has some like
   this.productOption[index]=this.list.find(x=>x.id=supplierId).options
   //or you call to an API o whatever, but remember you change
   this.productOption[index]=... 

}

Затем просто переберите this.productOption[i] во втором мат-выборе

<mat-select formControlName = "rawmaterialid" ...>
   <mat-option disabled selected hidden>Product</mat-option>
   <mat-option *ngFor = "let product_mode of productOption[i]"
           [value] = "product_mode.rawmaterialid">
           ....
    </mat-option>
 </mat-select>

Убедитесь, что вы не используете форму сброса где-либо в component.ts

Другие вопросы по теме