Это сводит меня с ума, я нахожусь под прицелом и не могу позволить себе потратить на это еще целый день.
Я пытаюсь вручную установить управляющее значение («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
системы, поле остается пустым! Я видел другое использование updateValue()
PPL, но это бета-версия 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>
источник
Ответы:
Обновлено: 19.03.2017
OLD:
На данный момент мы вынуждены сделать приведение типа:
Не очень элегантно, я согласен. Надеюсь, что это будет улучшено в будущих версиях.
источник
(<Control>this.form.controls['dept']).setErrors(null)
this.form.get('dept').setValue(selected.id)
:)this.form.controls.dept.setValue(selected.id);
this.form.controls['dept'].setValue(selected.id);
В Angular 2 Final (RC5 +) появились новые API для обновления значений форм. Метод
patchValue()
API поддерживает частичное обновление формы, где нам нужно только указать некоторые поля:Существует также
setValue()
метод API, которому нужен объект со всеми полями формы. Если пропущено поле, мы получим ошибку.источник
updateValue
(из принятого ответа Филоша) устарела в пользуsetValue
updateValue()
и введенияpatchValue
иsetValue
.Aangular 2 final имеет обновленные API. Они добавили много методов для этого.
Чтобы обновить элемент управления формы из контроллера, сделайте это:
Нет необходимости сбрасывать ошибки
Ссылки
https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html
https://toddmotto.com/angular-2-form-controls-patch-value-set-value
источник
setValue()
когда вызывается на aformGroup/formBuilder
, требуется установить все значения в форме.patchValue()
при вызове того же самого, может использоваться для обновления определенных значений.Вы можете использовать следующие методы для обновления значения элемента управления реактивной формы. Любой из следующих методов подойдет для ваших нужд.
Методы, использующие setValue ()
Методы, использующие patchValue ()
Последний метод зацикливает все элементы управления в форме, поэтому он не является предпочтительным при обновлении одного элемента управления.
Вы можете использовать любой метод внутри обработчика событий
При необходимости вы можете обновить несколько элементов управления в группе форм, используя
источник
Вы можете попробовать это:
Для получения более подробной информации вы можете взглянуть на соответствующий документ JS Doc относительно второго параметра
updateValue
метода: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model. тс # L269 .источник
error TS2339: Property 'updateValue' does not exist on type 'AbstractControl'
. В этом компоненте форма имеет типControlGroup
. Возможно, если бы я создал их по отдельности,new Control()
это бы сработалоНичто из этого не помогло мне. Я должен был сделать:
источник
Если вы не хотите вручную устанавливать каждое поле.
источник
@ Filoche's Angular 2 обновленное решение. С помощью
FormControl
(<Control>this.form.controls['dept']).updateValue(selected.id)
В качестве альтернативы вы можете использовать решение @ AngularUniversity, которое использует
patchValue
источник
Я знаю, что ответ уже дан, но я хочу дать немного краткий ответ, как обновить значение формы, чтобы другие новички могли получить четкое представление.
Ваша структура формы настолько идеальна, чтобы использовать ее в качестве примера. Итак, на протяжении всего моего ответа я буду обозначать его как форму.
поэтому наша форма представляет собой объект типа FormGroup, который имеет три FormControl .
Таким образом, при обновлении значения для экземпляра группы форм, который содержит несколько элементов управления, но вы можете захотеть обновить только части модели. patchValue () - это то, что вы ищете.
давайте посмотрим пример. Когда вы используете patchValue ()
но когда вы используете setValue (), вам необходимо обновить полную модель, так как она строго придерживается структуры группы форм. так что если мы напишем
Мы должны передать все свойства модели группы форм. как это
но я не часто использую этот стиль. Я предпочитаю использовать следующий подход, который помогает сделать мой код чище и понятнее.
Что я делаю, я объявляю все элементы управления как отдельную переменную и использую setValue () для обновления этого конкретного элемента управления.
для вышеупомянутой формы я сделаю что-то вроде этого.
когда вам нужно обновить элемент управления формы, просто используйте это свойство для его обновления. В этом примере спрашивающий пытался обновить элемент управления формы dept, когда пользователь выбирал элемент из выпадающего списка.
Я предлагаю взглянуть на API FormGroup, чтобы узнать как работают все свойства и методы FormGroup.
Дополнительно : узнать о геттере смотрите здесь
источник
Если вы используете контроль формы, то самый простой способ сделать это:
источник
Совет: если вы используете,
setValue
но не предоставляете все свойства формы, вы получите сообщение об ошибке:Must supply a value for form control with name: 'stateOrProvince'.
Таким образом, вы можете испытать искушение использовать
patchValue
, но это может быть опасно, если вы пытаетесь обновить целую форму. У меня естьaddress
тот, который может не иметьstateOrProvince
илиstateCd
зависит от того, США это или во всем мире.Вместо этого вы можете выполнить обновление следующим образом - в качестве значений по умолчанию будут использоваться пустые значения:
источник