NG01203 Angular Origin: On your device Last updated 15 Oct 2026

Angular: NG01203: No value accessor for form control with name: 'x' (ControlValueAccessor missing)

A form directive (formControlName, ngModel) is on an element or component that Angular cannot read/write values from.

Exact message you may see No value accessor for form control with nameNo value accessor for form control with unspecified name attribute
Seen on: Angular TypeScript

Meaning

Angular forms need a ControlValueAccessor. Native inputs have one once FormsModule / ReactiveFormsModule is imported. Custom components must implement ControlValueAccessor and register NG_VALUE_ACCESSOR, and third-party components (Material, PrimeNG) need their own module imported.

Common causes

  • FormsModule or ReactiveFormsModule not imported, so native inputs have no accessor
  • formControlName / ngModel placed on a component that does not implement ControlValueAccessor
  • NG_VALUE_ACCESSOR provider missing in a custom control
  • Wrong element (a div instead of input)
  • Library form module not imported

⚡ Quick fix

  1. Import ReactiveFormsModule or FormsModule
  2. Implement ControlValueAccessor and provide NG_VALUE_ACCESSOR with forwardRef
  3. Put the directive on the real input element

Detailed fix by platform

Angular

  1. providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StarRatingComponent), multi: true }] on the custom control
  2. Check the library docs for the module that provides the accessor

Code examples

Minimal custom control

typescript
@Component({
  selector: 'app-star-rating', standalone: true,
  template: `<button *ngFor="let s of [1,2,3,4,5]" (click)="set(s)">★</button>`,
  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StarRatingComponent), multi: true }],
})
export class StarRatingComponent implements ControlValueAccessor {
  value = 0; onChange = (_: number) => {}; onTouched = () => {};
  writeValue(v: number) { this.value = v ?? 0; }
  registerOnChange(fn: any) { this.onChange = fn; }
  registerOnTouched(fn: any) { this.onTouched = fn; }
  set(v: number) { this.value = v; this.onChange(v); }
}

How to diagnose

  1. Element — Native input or custom component?
  2. Module — Forms module imported?
  3. Accessor — ControlValueAccessor implemented and provided?

🔧 Still not fixed?

Many errors look alike. If the steps above didn’t solve it, one of these is probably what you’re facing:

Where this error sits

Origin: On your device. Errors that are often confused with or caused by this one (click to open):

Cannot find control with name — Angular: Error: Cannot find control with name: 'email' (reactive forms) (Angular)Cannot find control w…mat-form-field must contain a MatFormFieldControl — Angular Material: Error: mat-form-field must contain a MatFormFieldControl (Angular)mat-form-field must c…NG01050 — Angular: NG01050: formControlName must be used with a parent formGroup directive (Angular)NG01050NG01352 — Angular: NG01352: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' (Angular)NG01352NG8002 — Angular: NG8002: Can't bind to 'ngModel' since it isn't a known property of 'input' (Angular)NG8002NG8003 — Angular: NG8003: No directive found with exportAs 'ngForm' (template reference variable) (Angular)NG8003NG01203

Explore the map of this error Full error map →

🧠 Still stuck? Analyze your error

Paste the full message, response headers or stack trace — we'll detect the platform and point to the most likely cause.

💬 What worked for others

No tips yet — did something else fix this for you?

Share what worked for you

Tips are checked by an editor before they appear. Links are removed.