Проблемы с доступом к значению в компоненте переключателя
Итак, я пытаюсь сделать действительно простой и чистый компонент переключателя, который можно использовать с методом доступа к значению, который будет использоваться в общих сценариях угловых форм с
FormsModule
,
ReactiveFormsModule
и используя
changeDetectionStrategy.OnPush
но я столкнулся с проблемой (проблемами), которую вы можете увидеть НА ЭТОМ Stackblitz, где я получаю неожиданные результаты, которые, как я понимаю, вероятно, я что-то упускаю, так как я уже давно не делал собственное радио.
Когда он впервые загружается, вы получаете контуры радио, но не метки, пока не щелкнете что-нибудь и
writeValue
а также
onModelChange
не определены , пока я получаю
No value accessor for form control with name:
ошибка. Так что мог бы использовать другую пару глаз, чтобы я мог использовать экземпляр со старыми хорошими ngModel, formControlName, FormBuilder.
Вы увидите в Stackblitz метод доступа к значениям, который реализует
ControlValueAccessor
поэтому я немного сбит с толку, так как недавно я сделал тот же подход с другим компонентом. Я мог бы скопировать/вставить части блица сюда, но решил, что примера должно быть достаточно, если не просто дайте мне знать.
2 ответа
Я внес несколько изменений в ваш код на Stackblitz, пожалуйста, проверьте и дайте мне знать, решит ли это вашу проблему.
Ниже приводится сводка сделанных изменений:
- Представлено новое свойство RadioButtonComponent с именем
internalValue
и использовал его для привязки к[ngModel]
. Также обновляя его значение вwriteValue()
метод. - Прокомментировал код внутри
writeValue
относится кthis.checked
и ручное обновление доinput
элементchecked
имущество. Это должно автоматически обрабатываться API Angular Forms. - В HTML-шаблоне RadioButtonComponent удален
[attr.checked]
привязка и вместо использования привязки атрибута дляname
а такжеvalue
, просто использовал привязку свойства. - В app.component.html вместо использования привязки свойств используется двусторонняя привязка.
[(ngModel)]
синтаксис, так что значение будет отражено, когда вы печатаете его с помощьюngModel: {{testing}}
Вы также можете изменить/настроить другие вещи, но, надеюсь, приведенные выше изменения помогут вам начать работу.
providers: [RADIO_VALUE_ACCESSOR]
Вам не хватает этого в вашем коде. Вам нужно добавить это в провайдеров в компонентном декораторе