Angular Custom Form Control — получить значение по умолчанию

У меня есть настраиваемый элемент управления, который использует обратный вызов «ControlValueAccessor» — «registerOnChange» для отправки значения в родительскую форму всякий раз, когда значение элемента управления формы изменяется. Здесь нет проблем.

Но я также хочу отправить значение по умолчанию, которое я установил для пользовательского элемента управления во время OnInit. Проблема в том, что обратный вызов «registerOnChange» происходит только после OnInit.

Есть ли обходной путь?

У вас уже есть значение по умолчанию, когда вы его настраиваете. Почему ты не можешь это использовать?

Ritesh Waghela 25.04.2019 09:54

Разве добавленный ответ не решает вашу проблему?

Ashish Ranjan 26.04.2019 12:05
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
961
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 26.04.2019 12:46

@Muthukumar Понятно! Спасибо, что приняли ответ! :)

Ashish Ranjan 26.04.2019 12:47

Другие вопросы по теме