Показывать входные данные FormArray в нескольких столбцах

#angular #angular-material #formarray

#angular #angular-материал #formarray

Вопрос:

Я создал таблицу FormArray, и теперь я пытаюсь отобразить только 4 строки в 4 столбцах, потому что у меня есть массив, содержащий только 4 области, поэтому я создал комбинации region друг с другом region и с самим собой, используя вложенный цикл со сложностью O (n) ^ 2, который дал мне 16 комбинацийи при инициализации formarray все поля ввода отображаются в первом столбце, чего не должно быть. Мне нужно показать только 4 в каждом столбце. Я использую материал Angular, так как я могу этого добиться? Вот мой HTML-код

 <div *ngIf="enableCombinationDirective">
  <div fxLayout="row">
      <div class="h1">Add Prices</div>
      <div [formGroup]="combinationForm">
        <div formArrayName="dest" *ngFor="let item of combinationForm.get('dest')['controls']; let i = index">
          <div fxLayout="row" class="check" fxLayoutAlign="space-evenly">
            <mat-form-field appearance="outline" [formGroupName]="i" style="width: 20% !important;" apprearance="outline" fxFlex="50">
              <mat-label>{{
                combinationForm
                    .get("dest")
                    ["controls"][i].get("combinationTitle").value
            }}</mat-label>
            <input
                          matInput
                          type="number"
                          #destInput
                          formControlName="price"
                          placeholder="Enter Price"
                      />
                      <mat-checkbox
                      formControlName="isActive"
                      matSuffix
                  ></mat-checkbox>
            </mat-form-field>
          </div>
        </div>
        <div fxLayout="row">
          <button
              fxFlex="100"
              mat-raised-button
              color="primary"
              (click)="save()"
          >
              Save Changes
          </button>
      </div>
    </div>
  </div>
</div>
  

Форма работает нормально, и я тоже могу извлекать из нее данные. вот как это выглядит

введите описание изображения здесь

вот как я его инициализирую

  createCombinations() {
    let arrayOfData = [];
    arrayOfData.push({
      volumeSlabType: this.combinationSelectionForm.value.volumeSlab, 
      serviceType: this.combinationSelectionForm.value.serviceType,
      weightSlab: this.combinationSelectionForm.value.weightSlab,
      region: this.getRegionsCombinations(this.combinationSelectionForm.value.region)
    });

    this.data = arrayOfData;
    this.data[0].region.forEach((reg, i) => {
      const fArray = this.combinationForm.get("dest") as FormArray;
      fArray.push(this.createForm(reg, i));
    });
    console.log(this.data);
  }

  createForm(dest: any, index): FormGroup {
    let group: FormGroup;

    if(this.data) {
      group = this._fb.group({
        combinationTitle: [dest.combinationTitle],
        regionId: [dest.regionId],
        price: [],
        isActive: [false],
      });
    }
    return group;
  }

  getFormData(data): FormGroup {
    return data[0].region;
  }

  getRegionsCombinations(region) {
    let selectedRegion: IRegion[] = this.regions.filter((data) => data.id === region);
    let regionCombination = [];
    this.regions.forEach((region) => {
      this.regions.forEach((rData) => {
        regionCombination.push({
          combinationTitle: `${region.name} - ${rData.name}`,
          regionId: rData.id,
          price: 0
        });
      });
    });
    return regionCombination;
  }
  

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

1. или как я могу создать простую таблицу 4 * 4 в этой форме с 4 столбцами, и каждый столбец должен содержать 4 строки

2. Используйте ngModel вместо массива форм, это намного проще.

3. @JohnPeters ngModel может быть проще, но в настоящее время проблема связана с макетом формы, который мне нужно изменить. Можете ли вы мне помочь?

4. Извините, я не понял, что это проблема с макетом. Для исправления используйте Html-сетку с разметкой grid-template-colomns.

5. @JohnPeters Я использую материал angular с гибким css. Что мне нужно сделать, так это то, что после каждых 4 текстовых полей я хочу, чтобы следующие 4 поля в следующем столбце располагались справа, а не по прямой линии, как они отображаются в данный момент. Я не ниндзя CSS, поэтому небольшая помощь в коде мне очень поможет