Angular2 значение контроля формы обновления

У меня возникла проблема с созданием динамических форм angular2 с элементами управления и выборами, например, этот plunker:

    <select class="form-control" ngControl="power">
      <option *ngFor="#p of powers" [value]="p">{{p}}</option>
    </select>

Вы можете выбрать мощность героя, и элемент управления будет иметь такое же значение. Но если вы нажмете Change Powers, выбранное значение будет нулевым, но контрольное значение все еще является старым значением. Это серьезная проблема, я думаю, поскольку это источник множества ошибок, когда форма показывает одну вещь, но на самом деле она представит что-то другое, есть ли способ обновить содержимое элемента управления? Существует updateValue(), но вы должны вручную установить значение во всех этих случаях.

Существует также аналогичный случай, когда вы обновляете опции selectbox после построения формы, он отображает выбранное значение в выбранном поле, тогда как контрольное значение будет null, любые идеи о том, как с этим справиться?

Ответы

Ответ 1

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

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

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

Ответ 2

Update

с момента последнего обновления синтаксиса angular2 будет выглядеть следующим образом

this.form.controls['power'].setValue('anthing here');

Ответ 3

В настоящее время это единственное, что вы можете сделать (как упоминалось в вопросе)

this.form.controls['power'].updateValue(null);

Существует открытая проблема, позволяющая reset форме https://github.com/angular/angular/issues/4933

Существует также запрос на pull, но это также позволяет вам "вручную" для каждого элемента управления, но также позволяет reset состояниям, таким как нетронутые, коснутые,... https://github.com/angular/angular/pull/6679

Ответ 4

Вы можете попытаться сохранить форму неизменной. Когда вам понадобится reset, вы просто перестройте его. Этот способ может быть уверен в этом. Вы также можете сохранить значения, хранящиеся где-то, и reset form для этих значений. Скажем, вы редактируете элемент, когда вы reset можете вернуться к исходным значениям, а не просто к пустой форме...

export class TheForm {
  public form: ControlGroup;
  public controls = (value: any = {}) => ({
    'id': [value.id],
    'name': [value.name, Validators.required]
  });

  constructor() {
    let values = some_values_from_database || {};
    this.build(values);
  }

  build(value) {
    this.form = this._builder.group(this.controls(value));
  }

  submit() {
    console.log(this.form.value);
  }
}

Я создал базовую форму, которая обрабатывает эту функциональность с помощью @ngrx/store, здесь Gist. Когда мне нужна форма для другой модели, я буду расширять BaseForm и просто определять метод controls и submit(), остальное наследуется...

Ответ 5

[Angular 2 Стабильный]

Здесь грязный способ использования NgModel (и без импорта других модулей форм-форм или форм-групп)

//
// set form field, "foo" value to "bar"
//

//
// view
//
<form #formRef="ngForm">
    <input name="foo" [(ngModel)]="foo"></input>
</form>

//
// controller
//
class {
    @ViewChild('formRef') form: NgModel;

    ngAfterViewInit() {
        setTimeout(() => {
          this.form['controls']['foo'].setValue('bar');
        });
    }
}

Ответ 6

Код:

(<FormControl>this.form.controls['power']).updateValue(data);