Как динамически добавлять отфильтрованные значения для выпадающего списка Mat-Select - PullRequest
1 голос
/ 15 апреля 2020

Пожалуйста, дайте мне знать, что я должен сделать, чтобы каждая строка в массиве formArray не изменяла значения уже выбранных значений в других строках?

Обратите внимание: динамическое добавление элементов управления и правильное получение значений в фильтрах работают. Это только когда я изменяю это, это идет и изменяет другие выпадающие списки. Спасибо.

У меня есть рабочий FormArray, для которого элементы управления динамически добавляются при нажатии кнопки. Элементы управления имеют два раскрывающихся списка, и в зависимости от первого раскрывающегося списка значение второго раскрывающегося списка изменяется.

Однако при добавлении следующего элемента управления Dynami c и изменении значения второго выпадающий, он сбрасывает значение первых уже выбранных значений тоже. Для этих целей я использую материал <mat-select>.

My HTML:

<form [formGroup]="allocationForm" autocomplete="off">
          <div fxLayoutAlign="start center" id="allocationsDiv" class="container row">
            <mat-card-title style="text-align: left;">Models
              <button mat-raised-button class="mat-raised-button-custom" style="padding: 3px;"
                (click)="onAddCars()">Add Cars</button></mat-card-title>

            <ng-container formArrayName="allocationsArray">
              <div *ngFor="let ctrl of allocationControls.controls; let i = index" [formGroupName]="i">
                <mat-form-field appearance="outline" style="width: 250px;padding: 3px;">
                  <mat-label>Car Model</mat-label>
                  <mat-select formControlName="carModel" id="carModel"
                    (selectionChange)="filterCarModel($event, i)">
                    <mat-option *ngFor="let models of distinctModels" [value]="models">{{models}
                    </mat-option>
                  </mat-select>
                </mat-form-field>

                <mat-form-field appearance="outline" style="width: 350px;padding: 3px;">
                  <mat-label>Car Submodel</mat-label>
                  <mat-select formControlName="subModel" id="subModel" (selectionChange)="filtersubModel($event)">
                    <mat-option *ngFor="let subModel of subModels" [value]="subModel.itemValue">
                      {{subModel.displayValue}}
                    </mat-option>
                  </mat-select>
                </mat-form-field>
              </ng-container>

             </div>
</form>

Метод onAddCars() передает новые элементы управления в allocationsArray

Мои ts: для метода filterCarModel

public filterCarModel(e:any,ind:any)
  {
    let index = <FormArray>this.allocationForm.controls['allocationsArray'];
    var carList = Array.from(new Set(this.productsDTO.filter(x => x.productType === e.value).sort().values()));
    this.subModels = Array<Productdropdown>();
    carList.forEach(productLists => {
      const tempItem = new Productdropdown();
      tempItem.displayValue = productLists["carDescription"]
      tempItem.itemValue = productLists["carCode"]
      this.subModels.push(tempItem);
    });
  }

Как отфильтровать вторые контрольные значения, чтобы не изменять уже выбранные значения в первой строке allocationsArray in мой код используя angular 7x

onAddCars() примерно так ..

public onAddCars(){
      this.allocationControls.push(this.formBuilder.group({carModel: '',subModel:''}))
  }

Можете ли вы дать мне знать, что я должен делать, чтобы каждая строка формы Array не изменилась значения уже выбранных значений в других строках? любая помощь приветствуется. Обратите внимание: динамическое добавление элементов управления и правильное получение значений в фильтрах работают. Это только когда я изменяю это, это идет и изменяет другие выпадающие списки. Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Eliseo..Я должен принять ваш ответ, так как я следовал в правильном направлении. Ниже приведен мой код, который мне пришлось изменить

<mat-option *ngFor="let subModel of subModels[i]" [value]="subModel.itemValue">
                      {{subModel.displayValue}}
                    </mat-option>

, и я ввел для subModelsany [] [] = []; , как вы указали, но мне удалось сделать с FormArray в отличие от вашего решения.

0 голосов
/ 15 апреля 2020

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

Одним из подходов является то, что subModels был массивом или массивами

//declare subModels as array of any
subModels:any[]=[]
public filterCarModel(e:any,ind:any)
  {
    let index = <FormArray>this.allocationForm.controls['allocationsArray'];
    var carList = Array.from(new Set(this.productsDTO.filter(x => x.productType === e.value).sort().values()));

    //here declare this.subModels[ind] as an array
    this.subModels[ind] = Array<Productdropdown>();

    carList.forEach(productLists => {
      const tempItem = new Productdropdown();
      tempItem.displayValue = productLists["carDescription"]
      tempItem.itemValue = productLists["carCode"]

      //you push the element in this.subModels[ind]
      this.subModels[ind].push(tempItem);
    });
  }

Другой подход состоит в том, что ваш productList был и массив с детьми. Представьте, что у вас есть что-то вроде

modelList=[{
      id:1,
      model:'Audi',
      submodels:[{id:10,name:'A3'},{id:11,name:'Quatro'}]
      },
      {
      id:2,
      model:'Seat',
      submodels:[{id:20,name:'Ibiza'},{id:21,name:'Panda'},{id:22,name:'Leon'}]
      },
  ]

Я представляю массив формы с моделью и подмоделью, поэтому мы создаем две функции

getLine(data:any)
  {
    data=data || {model:'',submodel:''}
    return new FormGroup({
      model:new FormControl(data.model),
      submodel:new FormControl(data.model)
    })

  }
  addLine()
  {
    this.formArray.push(this.getLine(null))
  }

Я собираюсь использовать вспомогательную переменную и [ngModel] в виде. Обратите внимание, что переменная не принадлежит форме formArray, я использую ее как вспомогательный и использую (ngModelChange), чтобы присвоить значение formArray.get ('model')

Моя переменная

model:any[]=[]

И. html

<button mat-button (click)="addLine()">Add</button>
<form [formGroup]="formArray">
    <div *ngFor="let group of formArray.controls;let i=index" [formGroup]="group">
        <mat-form-field>
            <mat-label>Model</mat-label>
            <!-- the ngModel is model[i] -->
            <mat-select [ngModel]="model[i]"
             <!--in ngModelChange we equal model[i] to event
                 and give value to group.get('model')-->
             (ngModelChange)="model[i]=$event;group.get('model').setValue($event.id)"
             <!--I need indicate that the ngModel is NOT belong to the form-->
             [ngModelOptions]="{standalone:true}"
             >
               <!--see that value is the "modelo", ALL the object-->
                <mat-option *ngFor="let modelo of modelList" [value]="modelo">
                    {{modelo.model}}
                </mat-option>
            </mat-select>
        </mat-form-field>
        <mat-form-field>
            <mat-label>SubModel</mat-label>
            <!--this select use formControlName as ussuall-->
            <mat-select formControlName="submodel">
                <!--here I can use model[i].submodels-->
                <mat-option *ngFor="let submodelo of model[i]?.submodels" [value]="submodelo.id">
                    {{submodelo.name}}
                </mat-option>
            </mat-select>
        </mat-form-field>

    </div>
</form>

Вы можете увидеть в stackblitz

...