Angular2 - Вручную установить значение для элемента управления FormBuilder

Это сводит меня с ума, я под пистолетом и не могу позволить себе провести еще целый день на этом.

Я пытаюсь вручную установить контрольное значение ('dept') внутри компонента, а его просто не работает - даже новое значение регистрируется для правильной консоли.

Вот экземпляр FormBuilder:

initForm() {
  this.form = this.fb.group({
    'name': ['', Validators.required],
    'dept': ['', Validators.required],
    'description': ['', Validators.required],
  });
}

Это обработчик событий, который получает выбранный отдел:

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // This is how I am trying to set the value
  this.form.controls['dept'].value = selected.id;
}

Теперь, когда форма отправлена, и я выхожу из системы this.form, поле остается пустым! Я видел другое использование ppl updateValue(), но это бета-версия .1, и я не вижу в качестве допустимого метода вызова элемента управления.

Я также попытался вызвать updateValueAndValidity() без успеха: (.

Я просто использовал бы ngControl="dept" в элементе формы, как я делаю с остальной частью формы, но с ее настраиваемой директивой/компонентом.

<ng-select
  [data]="dept"
  [multiple]="false"
  [items]="depts"
  (selected)="deptSelected($event)" <!-- This is how the value gets to me -->
  [placeholder]="'No Dept Selected'"></ng-select>

Ответ 1

Обновлено: 19/03/2017

this.form.controls['dept'].setValue(selected.id);

OLD:

В настоящее время мы вынуждены делать листинг типов:

(<Control>this.form.controls['dept']).updateValue(selected.id)

Не очень элегантный, я согласен. Надеюсь, что это улучшится в будущих версиях.

Ответ 2

В Angular 2 Final (RC5 +) появились новые API для обновления значений форм. Метод API patchValue() поддерживает частичные обновления формы, где нам нужно только указать некоторые из полей:

this.form.patchValue({id: selected.id})

Существует также метод API setValue(), которому нужен объект со всеми полями формы. Если отсутствует поле, мы получим сообщение об ошибке.

Ответ 3

angular 2 final обновил там API. они добавили много методов для этого.

для обновления формы controll от контроллера выполните это

this.form.controls['dept'].setValue(selected.id);

this.form.controls['dept'].patchValue(selected.id);

не нужно reset ошибок

ссылка

https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html

https://toddmotto.com/angular-2-form-controls-patch-value-set-value

Ответ 4

Вы можете попробовать следующее:

deptSelected(selected: { id: string; text: string }) {
  console.log(selected) // Shows proper selection!

  // This is how I am trying to set the value
  this.form.controls['dept'].updateValue(selected.id);
}

Для получения дополнительной информации вы можете посмотреть соответствующий JS Doc относительно второго параметра метода updateValue: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model.ts#L269.

Надеюсь, он тебя обманет, Thierry

Ответ 5

  let cloneObj = Object.assign({}, this.form.getRawValue(), someClass);
  this.form.complexForm.patchValue(cloneObj);

Если вы не хотите вручную устанавливать каждое поле.

Ответ 6

@Filoche Angular 2 обновленное решение. Использование FormControl

(<Control>this.form.controls['dept']).updateValue(selected.id)удаp >

import { FormControl } from '@angular/forms';

(<FormControl>this.form.controls['dept']).setValue(selected.id));

В качестве альтернативы вы можете использовать @AngularUniversity решение, которое использует patchValue