Обновить контрольное значение при наблюдении за изменениями - PullRequest
0 голосов
/ 19 октября 2018

Я наблюдаю за изменениями в реактивной форме, подписываясь на изменения стоимости.Когда определенные значения не заданы в форме, я устанавливаю переключатель углового скольжения материала в значение false (чтобы установить флаг «Активный» в значение false для текущей редактируемой записи данных).

То, что я нахожу, этоЯ должен отложить вызов setValue для элемента управления или при следующем нажатии он не переключается.Есть событие изменения значения, но значение все еще установлено в false.Примерно то, что я делаю, это:

this.editForm.valueChanges.subscribe(form => {
  var valid = true;
  if (!form.isRequired) 
    valid = false;
  if (!valid) {
    setTimeout(()=>{
      this.editForm.controls['isActive'].setValue(false);
    },1);
  }
});

Посмотрите пример без setTimeout на https://stackblitz.com/edit/angular-fp5tya, и пример с правильным поведением и setTimeout на https://stackblitz.com/edit/angular-fp5tya-m9yy7n. Нажмите «Активно», затем«Требуется активировать», тогда «активный» должен привести к тому, что оба флажка будут активными.Однако «Активный» нужно нажать снова.Аналогично, нажатие «Активно» без установки «Обязательный» будет выдавать предупреждение только при каждом втором щелчке, когда состояние формы должно вернуться в исходное состояние.

Я считаю, что необходимо использовать setTimeout в качестве обходного пути.Есть ли способ установить значения в форме в форме наблюдателя, не откладывая ее?

1 Ответ

0 голосов
/ 19 октября 2018

Это, вероятно, не проблема с MatSlideToggle.Срабатывание события непосредственно из обработчика того же события может быть непредсказуемым.Всякий раз, когда вам нужно изменить результат события изменения после изменения произошли, но до его завершения (например, в случае значения valueChanges), правильный способ сделать это изменение - это иметь его.запустить событие после окончания текущего цикла событий.Так что использование setTimeout является правильным подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...