Как динамически создать FromGroup из наблюдаемой? - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю эту страницу, которая должна содержать несколько реактивных ответов (например, для каждой страны).Эти формы должны быть основаны на массиве json, который я получаю от серверной части, чтобы пользователь мог видеть текущую настройку и обновлять ее по отдельности.Так как я не знаю, сколько из этих наборов данных я получу, я создал одну основную форму и FormArray для каждого набора данных, который я получаю.Однако, если я использую FormArray, когда одно из полей помечено как недействительное валидаторами формы, вся форма помечается как недопустимая (все вложенные формы FormArray).

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

TS2339: Property 'countryForm' does not exist on type 'CountryComponent'.

, так что вот мой TS

export class CountryComponentimplements OnInit {

// Form
countryForm: FormGroup;

  ngOnInit() {
    this.spinner.show();
    this.GetCountryDef();
  }

 GetCountryDef() {
    // tslint:disable-next-line:max-line-length
    this.http.get(`https://api_call`).subscribe(
        (data: any) => {

        // Form
        const CountryArray = new FormArray(data.map(item => new FormGroup({
          country: new FormControl(item.country, Validators.required),
          population: new FormControl(item.population, Validators.pattern(/\-?\d*\.?\d{1,5}/)),
          GPD: new FormControl(item.GPD, Validators.pattern(/\-?\d*\.?\d{1,5}/))
          .......
        }),
      ));

        this.countryForm= this.fb.group({
          country: CountryArray ,
        });

      this.spinner.hide();
      }

      );
 }

Мой HTML

<td mat-cell *matCellDef="let country; let i = index">  
            <form style="width: inherit;" [formGroup]="countryForm">
                <div formArrayName="country">
                    <div formGroupName={{i}}>
                        <label >populcation:</label> 
                        <input matInput type="number" formControlName="population">

                        <label >GPD:</label>  
                        <input matInput type="number" formControlName="GPD">
.......
            </form>
          </td>

Итак, мои вопросы: как я могу динамически создать FromGroup из наблюдаемой или как сделать так, чтобы валидатор отмечал ошибку только для одного массива FormArch?

=============================================================================== @ AJT_82 Я пробовал это сделать, но форма не отображается даже после загрузки.

Так что я изменил его на

   export class CountryComponentimplements OnInit {
   // Form
   //countryForm: FormGroup;

и

   let countryForm: FormGroup; // Will change to to different form for each country after
    countryForm= this.fb.group({
      country: CountryArray ,
    });

, и это дает мне ту же ошибку

TS2339: Property 'countryForm' does not exist on type 'CountryComponent'.

1 Ответ

0 голосов
/ 12 февраля 2019

Пользователь, вы используете mat-table?Рабочий стол таблицы матов по массиву, это правда, что массив может быть массивом FormControls, но с массивом элементов управления формой трудно работать.*

Вместо этого вы можете создать обычную таблицу с массивом

    <table >
        <thead>
            <tr >
                <th >Country</th>
                <th >Population</th>
                <th >GDP</th>
            </tr>
        </thead>
        <tbody *ngIf="formArray" [formGroup]="formArray">
            <tr  *ngFor="let item of formArray.controls;let i=index" [formGroupName]="i">
                <td ><input formControlName="country"></td>
                <td ><input formControlName="population"></td>
                <td ><input formControlName="GDP"></td>
            </tr>
        </tbody>
    </table>

, где я предпочитаю обращаться к самому массиву.

Если мы добавим FormBuilder в конструктор

  constructor(private fb:FormBuilder){}

, наш formArray может быть таким, как:

  this.formArray=new FormArray(data.map(item=>{
    return this.fb.group({
      country:item.position,
      population:item.name,
      GDP:item.weight
    })
  }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...