
Advanced workshop
Architecting Angular Apps for High Performance
High-Speed Angular applications on any device
Learn more
If you’ve been building custom form controls in Angular for a while, you know what to expect. You want to wrap a simple <input>ControlValueAccessor
You have to implement writeValueregisterOnChangeregisterOnTouchedsetDisabledState
Currently a custom input component with CVA looks something like this:
import { Component, forwardRef, input } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
selector: 'app-custom-input',
template: `
That is about to change.
With Pull Request #67267, Angular is bridging the gap between the new Signal-Forms architecture and the Template/Reactive Forms. This isn't just a minor update—it’s a fundamental shift in how we author custom form controls.
FormValueControlImagine creating a custom input where the "form logic" is just… a Signal.
Thanks to this new PR, Angular now supports Signal-Based FormValueControl components via the FormValueControlvaluengModelFormControl
Here is the "Before" (CVA) vs. "After" (Signals):
(Trigger warning: Boilerplate)
@Component({ ... })
export class OldInputComponent implements ControlValueAccessor {
value: string = '';
onChange = (val: string) => {};
onTouched = () => {};
writeValue(value: string): void {
this.value = value;
}
registerOnChange(fn: any): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void {
this.onTouched = fn;
}
// ... and don't forget the providers array!
}
(Look at how clean this is!)
@Component({
selector: 'fancy-input',
template: `
`,
})
export class FancyInput implements FormValueControl
You won't have to register callbacks and manually fire onChangemodel()
This isn't a "new forms module" that requires you to rewrite your entire app. This PR adds support for these signal-based controls inside existing Template and Reactive Forms. You can start building new controls this way today and drop them right into your existing [formGroup]
It’s not just about the value. This update ensures that validation status, "touched" state, and "dirty" state are all synchronized.
class MyFancyInput implements FormValueControl
This change is a massive win for Developer Experience (DX). It lowers the barrier to entry for creating reusable form components and fully embraces Angular's Signal era.
Get ready to delete a lot of registerOnChange

Advanced workshop
High-Speed Angular applications on any device
Learn more