Как запускать "valueChanges" программно?
На одной из моих страниц я использую FormBuilder
для заполнения формы при инициализации. Каждый вход получает класс, когда вход не пуст. Это делается путем добавления ngClass
к каждому входу и подписки на FormGroup
valueChanges
.
Моя проблема возникает всякий раз, когда форма заполняется программно. Всякий раз, когда пользователь меняет любое значение формы, вызов valueChanges
вызывается, однако, это не тот случай, когда используется FormBuilder
.
Мой вопрос: как получить событие valueChanges
, которое будет запущено, когда закончится FormBuilder
.
Я попытался использовать this.FormGroup.updateValueAndValidity()
, но это ничего не привело.
Ответы
Ответ 1
Я нашел решение, которое сработало для меня. Я забыл два параметра в функции updateValueAndValidity
.
- onlySelf: будет обновлять этот
FormControl
когда true. - emitEvent: вызовет событие
valueChanges
когда оно будет истиной.
Таким образом, в результате вы получите что-то вроде: FormGroup.updateValueAndValidity({ onlySelf: false, emitEvent: true });
Ответ 2
Ваш вопрос не ясен на 100%, но я думаю, что вы говорите:
Мой valueChanges прекрасно работает при изменении чего-либо в пользовательском интерфейсе, но я хочу вызвать логику моей функции подписки, как только я закончу инициализацию объекта FormBuilder в моем конструкторе для обработки начальных условий.
В этом случае то, что я делаю, довольно просто:
this.searchForm.valueChanges
.pipe(startWith(initialValues)).subscribe(value =>
{
// whatever you want to do here
});
initialValues
- это необработанные данные, с которыми вы инициализировали форму. Вы могли бы, вероятно, просто положить в searchForm.getRawValue()
тоже.
Это просто приводит к тому, что наблюдаемое срабатывает немедленно.
Ответ 3
Название и описание вашего вопроса немного вводят в заблуждение. Что он? (Я)
- Вы хотите обновить статус работоспособности поля при программном изменении его значения?
- Или вы хотите, чтобы ваша подписка на
valueChanges
поля вызывалась при программном изменении ее значения?
В любом случае, посмотрите этот Plunkr: https://plnkr.co/edit/4V4PUFI1D15ZDWBfm2hb?p=preview
Вы увидите, что когда вы установите значение поля программно следующим образом:
this.myForm.get('myField').setValue(newValue);
Обновлены как допустимость, так и valueChanges
, наблюдаемая для поля. Итак, похоже, вы пытаетесь воссоздать уже существующее поведение.
Однако свойство dirty
этого поля НЕ обновляется при программном изменении его значения (как для документа: "Элемент управления загрязнен, если пользователь изменил значение в пользовательском интерфейсе" ). Может быть, вы проверяете свойство dirty
, чтобы указать полевые ошибки, и что у вас есть иллюзия, что статус действительности не обновляется, а на самом деле это только свойство dirty
, которое не обновлено?
(i) Эти две вещи разные. Вы не должны подписываться на valueChanges
для ручного запуска проверки. Проверка должна выполняться путем объявления валидаторов в вашей модели формы.