Как запускать "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 для ручного запуска проверки. Проверка должна выполняться путем объявления валидаторов в вашей модели формы.