У меня есть настраиваемый элемент управления, который использует обратный вызов «ControlValueAccessor» — «registerOnChange» для отправки значения в родительскую форму всякий раз, когда значение элемента управления формы изменяется. Здесь нет проблем.
Но я также хочу отправить значение по умолчанию, которое я установил для пользовательского элемента управления во время OnInit. Проблема в том, что обратный вызов «registerOnChange» происходит только после OnInit.
Есть ли обходной путь?
Разве добавленный ответ не решает вашу проблему?





ngAfterViewInit() будет вызываться после запуска метода registerOnChange.
Вы можете программно установить значение ввода здесь, но это не вызовет зарегистрированный метод onChange() (скажем, имя onChange). Вам нужно будет явно вызвать его. Теперь проблема возникает из-за ошибки ExpressionChangedAfterItHasBeenCheckedError.
Проблема в том, что проверка может произойти и в родительском компоненте, если там есть привязки к дочернему элементу управления. Вызов detectCahnges() проверит только изменения в текущем компоненте и его дочерних элементах. Выполнение markForCheck() пометит это и его предков для проверки при обнаружении следующего изменения, но не вызовет немедленное обнаружение изменений. Если ничего не поможет, setTimeout() обязательно.
У вас может быть что-то вроде:
ngAfterViewInit() {
setTimeout(() => {
this.value = "changed value";
this.onChange(this.value)
})
}
<input
[value] = "value"
(input) = "onChange($event.target.value)"
(blur) = "onTouched()"
[disabled] = "isDisabled"
type = "text">
См. пример здесь: https://stackblitz.com/edit/controlvalueaccessorgeneric-srsut9?file=src/app/app.component.ts
Но опять же, зачем вам это нужно? Вы всегда можете указать начальные значения управления формой во время инициализации реактивной формы.
Спасибо. Я обрабатываю это с помощью setTimeout, как вы предложили. Мне это нужно, так как мой пользовательский элемент управления по своей сути имеет значение, даже если он не инициализируется
@Muthukumar Понятно! Спасибо, что приняли ответ! :)
У вас уже есть значение по умолчанию, когда вы его настраиваете. Почему ты не можешь это использовать?