Метод для установки значения и обновления достоверности элемента управления формой

Мне интересно, есть ли какой-либо способ установить значение и обновить действительность элемента управления формы. Учитывая следующее:

this.updateForm = this._formBuilder.group({
    user: ['',Validators.required]     
});

У меня есть директива, которая имеет триггер изменения, который запускает следующее:

changeUserSelection(value){
    this.updateForm.controls['user'].value = value // doesnt trigger validation?
}

И мне интересно, как я могу установить значение и вызвать проверку этого поля. Делая это по-моему, проверка не вызывается.

Спасибо


person uksz    schedule 31.03.2016    source источник


Ответы (5)


Вместо этого вы должны использовать метод updateValue:

changeUserSelection(value){
  this.updateForm.controls['user'].updateValue(value);
}
person Thierry Templier    schedule 31.03.2016
comment
В какой версии angular это было введено? - person uksz; 31.03.2016
comment
По какой-то причине мой TS этого не видит, и я получаю сообщение об ошибке: Свойство updateValue не существует для типа «AbstractControl». - person uksz; 31.03.2016
comment
Да, потому что метод находится в классе Control, а не в классе AbstractControl. Control расширяет AbstractControl. См. github.com/angular. /angular/blob/master/modules/angular2/src/ - person Thierry Templier; 31.03.2016
comment
ждать. но когда я создаю форму с помощью formBuilder, она возвращает AbstractControls... верно? - person uksz; 31.03.2016
comment
Да, но вы пытаетесь установить значение для элемента управления вводом в форме. В данном случае это Control, то есть this.updateForm.controls['user']. - person Thierry Templier; 31.03.2016
comment
Это странно. Мы видим, что экспорт объявляет класс ControlGroup extends AbstractControl {controls: { [key: string]: AbstractControl; }; . Следовательно, это абстрактный элемент управления. - person uksz; 31.03.2016
comment
Да, потому что вы можете создать подгруппу, и в этом случае это контрольная группа, а не контрольная. См. этот вопрос: stackoverflow.com/questions /35413693/. Но для элемента управления, который соответствует вводу, это элемент управления. - person Thierry Templier; 31.03.2016

Обновление до финала Angular2

В соответствии с окончательным выпуском angular2 updateValue был изменен на setValue, поэтому новый синтаксис должен быть таким

changeUserSelection(value){
  this.updateForm.controls['user'].setValue(value);
}
person Pardeep Jain    schedule 29.11.2016
comment
updateValueAndValidatity необходимо вызвать для запуска функций валидатора. - person Yuanfei Zhu; 05.12.2016
comment
Также обратите внимание, что setValue не будет обновлять исходный статус элемента управления. markAsDirty нужно вызывать явно. - person Yuanfei Zhu; 05.12.2016
comment
да точно @YuanfeiZhu - person Pardeep Jain; 05.12.2016
comment
Иногда нужно markAsTouched(). С материалом Angular и ErrorMatcher по умолчанию элемент управления не будет отображать сообщение об ошибке, пока его не коснутся. На самом деле это не должно быть «грязным». - person Simon_Weaver; 13.07.2020
comment
@Simon_Weaver кажется, вы правы, если вы хотите отредактировать мой ответ, я был бы более чем счастлив одобрить, пожалуйста, идите. - person Pardeep Jain; 14.07.2020
comment
@PardeepJain спасибо за ответ. Кажется, для моей ситуации мне нужны были и markAsTouched(), и updateValueAndValidity. Может быть много тонкостей, поэтому, возможно, лучше оставить ответ как есть и надеяться, что люди прочитают и учтут комментарии. Это целый проект, учитывающий все возможности, плюс такие вещи, как Angular Material, добавляют дополнительную сложность с помощью ErrorStateMatcher (см. 16940). - person Simon_Weaver; 14.07.2020
comment
dirty означает, что значение изменилось, тогда как touched просто означает, что оно было в фокусе. Честно говоря, в большинстве случаев это, вероятно, не окажет никакого влияния, если у вас нет особых потребностей. - person Simon_Weaver; 14.07.2020

Вы также можете попробовать patchValue

this.updateForm.patchValue({ user: value });
person Mackelito    schedule 24.05.2017

Для меня setValue, patchValue не сделали работу сами. Что я сделал для запуска проверки, так это следующее:

form.controls[field].setValue(value);
form.controls[field].markAsTouched();
form.controls[field].markAsDirty();
form.controls[field].updateValueAndValidity();

Таким образом, мои сообщения проверки были запущены правильно. Я пробовал без updateValueAndValidity, но не получилось.

person Vallerious    schedule 07.01.2020

Вы можете попробовать this.form.updateValueAndValidity(); обновить значение и проверку для нескольких элементов управления.

person Kathrecha Krishna    schedule 30.04.2020