Почему mat-select очищает значение в этой реактивной форме? - PullRequest
0 голосов
/ 07 мая 2019

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

Я уже пытаюсь адаптировать это https://medium.com/aubergine-solutions/add-push-and-remove-form-fields-dynamically-to-formarray-with-reactive-forms-in-angular-acf61b4a2afe без удачи

шаблон

<mat-horizontal-stepper [linear]="true" #stepper style="background: transparent">
  <mat-step *ngFor="let materia of materias;let m = index;" [stepControl]="createForm(materia.id)">
    <ng-template matStepLabel>{{materia.descripcion}}</ng-template>
    <form [formGroup]="getForm(materia.id)">
      <div fxLayout="column" fxLayoutAlign="space-around stretch" fxLayoutGap="10px">
        <div>
          <mat-card *ngFor="let competencia of materia.competencias">
            <mat-card-header>
              <mat-card-title>{{competencia.nombre}}</mat-card-title>
            </mat-card-header>
            <mat-card-content>              
              <div fxLayout="column" fxLayoutGap="30px" formArrayName="{{createFormArray(materia.id,competencia.id)}}">
                <div fxLayout="row">
                  <i>{{competencia.descripcion}}</i>
                </div>
                <div fxLayout="column" fxLayoutGap="2px">
                  <span *ngFor="let competenciaSimple of competencia.competenciasSimples; let i = index;" fxLayout="row">
                    <mat-form-field appearance="outline"
                      *ngIf="competenciaSimple !== null && competenciaSimple !== undefined" fxFlex>
                      <mat-select (selectionChange)="onSelected($event,competenciaSimple)"
                        [value]="getSelectedValue(competenciaSimple)" [formControl]="createControl(materia.id,competencia.id)" [id]="i">
                        <span *ngFor="let fase of competenciaSimple.fases">
                          <mat-option *ngFor="let conductaObservable of fase.conductasObservables"
                            [value]="conductaObservable">
                            {{conductaObservable.descripcion}}
                          </mat-option>
                        </span>
                      </mat-select>
                    </mat-form-field>
                    <!-- <input type="hidden" value="competenciaSimple" [(ngModel)]="calificacion.conductasObservables[i].competenciaSimple"/> -->
                  </span>
                </div>
              </div>

            </mat-card-content>
          </mat-card>
        </div>
        <div fxLayout="row">
          <button mat-flat-button type="button" matStepperPrevious *ngIf="!isFirstPage" color="primary"
            fxFlex="20">ANTERIOR</button>
          <span fxFlex="80"></span>
          <button mat-flat-button type="button" *ngIf="!isLastPage" color="primary" fxFlex="20">SIGUIENTE</button>
          <button mat-flat-button type="button" (click)="onSubmit()" *ngIf="isLastPage" color="accent"
            fxFlex="20">TERMINAR</button>
        </div>
      </div>
    </form>
  </mat-step>
</mat-horizontal-stepper>

component.ts


forms = new Array<FormGroup>();

getForm(index: number): FormGroup {
    return this.forms[index];
  }

  createForm(index: number): FormGroup {
    const form = this.formBuilder.group({});
    this.forms[index] = form;
    return form;
  }

  createFormArray(index: number, name: string): string {
    const array = this.formBuilder.array([]);
    const arrayName = `competencia_${name}`;
    this.forms[index].addControl(arrayName, array);
    return arrayName;
  }

  createControl(index: number, arrayName: string): FormControl {
    const control = this.formBuilder.control(false);
    const an = `competencia_${arrayName}`;
    const array = (this.forms[index].get(an));
    (array as FormArray).push(control);
    return control;
  }

  getControlId(): string {
    this.controlNumber += 1;
    return this.controlNumber.toString()
  }

Идеязаключается в проверке выбора циновки по мере необходимости, чтобы шаговый двигатель не мог двигаться, когда не выбрано никакого значения, это работает, если добавить валидатор, но выбор циновки не сохраняет значение, поэтому, если я удаляю [formControl]="createControl(materia.id,competencia.id)" матвыберите работу, но нет результата проверки.

1 Ответ

1 голос
/ 08 мая 2019

Существует несколько популярных библиотек Angular Form с открытым исходным кодом (вы можете взглянуть на исходный код и посмотреть, как они динамически добавляют проверки в элемент управления):

...