У меня есть пользовательский элемент управления формы, который реализует ControlValueAccessor
. Я инициализирую группу реактивной формы и управляю значением. Я хочу изменить это значение внутри элемента управления, чтобы внешняя форма получила это мутировавшее значение.
Это прекрасно работает для генерации события onChange()
, когда я взаимодействую с элементом управления, и новое значение устанавливается через пользовательский интерфейс, однако это начальное значение (установленное через FormBuilder
) не вызывает событие form.valueChanges
, когда оно внутренне изменяется, поэтому форма никогда не будет иметь измененного значения, если вы никогда не измените значение элемента управления через пользовательский интерфейс.
Единственный способ выяснить, как убедиться, что форма видит измененное значение, - это обернуть setTimeout
вокруг вызова this.onChange(this.value)
, что кажется неправильным. Попытка выяснить, пытался ли кто-нибудь попробовать это и нашел лучшее решение, чем setTimeout
?
Вот очень урезанный стековый блик, чтобы показать сценарий: https://stackblitz.com/edit/angular-t28bst?file=src%2Fapp%2Fform-control%2Fform-control.component.ts
Вы можете видеть, что внутренне значение равно «hello world», тогда как внешняя форма отображает только «hello», если только вы не нажмете кнопку «Update Value» внутри элемента управления (который просто устанавливает value = value
), а затем форма увидит его. Кроме того, вы можете раскомментировать setTimeout
вокруг вызова onChange()
и посмотреть, что это тоже работает.