ControlValueAccessor là adapter giữa Angular Forms API và custom UI component.
Skeleton tối thiểu:
typescript
export class RatingInput implements ControlValueAccessor {
value = 0
disabled = false
private onChange = (value: number) => {}
private onTouched = () => {}
writeValue(value: number) { this.value = value }
registerOnChange(fn: (value: number) => void) { this.onChange = fn }
registerOnTouched(fn: () => void) { this.onTouched = fn }
setDisabledState(disabled: boolean) { this.disabled = disabled }
}Lỗi phổ biến là emit change trong writeValue, gây loop.