Повторная инициализация группы угловых форм

В Angular 8 у меня есть группа форм, в которой я хочу повторно инициализировать форму с новыми значениями. Но когда я делаю fb.build во второй раз, значения отображаются неправильно.

Флажок становится неотмеченным, хотя он должен быть отмечен, а поле ввода показывает [object Object]

<form [formGroup]="myform" novalidate autocomplete="off">
    <mat-checkbox
      formControlName="dndcheckbox"
      [(ngModel)]="userdetails.DoNotDisturb"
    ></mat-checkbox>
    <mat-form-field>
      <input matInput type="text" formControlName="fwdNumber" [(ngModel)]="userdetails.ForwardNumber" />
    </mat-form-field>
</form>

userdetails: MyObject;
myform: FormGroup;
constructor(private fb: FormBuilder,) {}

ngOnInit() {
      this.myService.refreshDataSubject.subscribe((data) => {
        this.userdetails = data;
        this.initializeForm();
      });
}

initializeForm() {
    this.myform = this.fb.group({
      dndcheckbox: ['', ''],
      fwdNumber: [
        {
          value: this.userdetails.ForwardNumber,
        },
        control => validateTelephoneNumber(this.userdetails.ForwardNumber),
      ],
    });
}

Что может пойти не так?


person user5155835    schedule 04.03.2020    source источник
comment
Вы проверяли консоль? Получаете ли вы какую-либо ошибку?   -  person kushal shah    schedule 04.03.2020


Ответы (2)


Думаю проблема в ваших данных. Структура вашего объекта userdetails и объекта данных, полученного от вашей службы, на которую вы подписались, не совпадают. может быть данные не имеют такой же подписи пользовательских данных. консоль его, чтобы проверить, если это в порядке или нет.

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

Поскольку я не уверен в структуре вашего объекта, здесь я предполагаю, что ваша служба возвращает объект данных, подобный этому {IsDndChecked: true, ForwardNumber: '123245'}

  ngOnInit() {
    this.initializeForm();

    this.myService.refreshDataSubject.subscribe((data) => {
      this.userdetails = data;
      this.updateFormValue(data);
    });
  }

  initializeForm() {
      this.myform = this.fb.group({
        dndcheckbox: [''],
        fwdNumber: ['', this.validateTelephoneNumber],
      });
  }

  validateTelephoneNumber(control: AbstractControl) {
    alert(control.value);
  }

  updateFormValue(data: any) {
    this.myform.setValue({
      dndcheckbox: data.IsDndChecked,
      fwdNumber: data.ForwardNumber
    });
  }

здесь Внутри ngOnInit() я вызываю метод initializeForm() для создания формы. Я создаю форму один раз, и когда изменение данных вызывается updateFormValue() для обновления значения формы.

Другое дело, вы можете установить функцию валидатора таким образом fwdNumber: ['', this.validateTelephoneNumber] и не нужно передавать значение (смотрите, я не отправляю значение в качестве параметра).

Когда вы обновляете значение поля (вы можете обновить значение из пользовательского интерфейса или с помощью таких функций, как setValue() или patchValue(). для получения дополнительной информации об этих двух функциях угловой реактивной формы см. здесь) конкретный элемент управления автоматически передается его пользовательской функции проверки.

Если вы видите фрагмент кода выше, вы обнаружите, что я не отправлял никаких параметров, а реализовал свой метод.

validateTelephoneNumber(control: AbstractControl) {
    alert(control.value);
  }

ожидает конкретный элемент управления формы fwdNumber.

Таким образом, код становится более чистым и управляемым. Надеюсь, поможет.

person Sadid Khan    schedule 04.03.2020

вместо сохранения в this.userdetails напрямую передать в качестве аргумента this.initializeForm(data)

и повторно инициализировать значение из аргумента данных

person Manojkumar Muthukumar    schedule 04.03.2020
comment
как это имеет значение? - person user5155835; 04.03.2020
comment
Пожалуйста, проверьте ответ, который вы сохранили в this.userdetails в HTML, используя {{userdetails | json }} это. возможно, цикл JSON отличается, - person Manojkumar Muthukumar; 04.03.2020
comment
Я проверил ответ userdetails - person user5155835; 04.03.2020
comment
Попробуйте изменить тип сведений о пользователе с MyObject на any и вызовите значение, подобное этому.userdetails['ForwardNumber'] - person Manojkumar Muthukumar; 04.03.2020