Skip to content

fix(forms): Support Signal Forms in form controls - #17566

Open
rkaraivanov wants to merge 5 commits into
masterfrom
rkaraivanov/fix-17556
Open

fix(forms): Support Signal Forms in form controls#17566
rkaraivanov wants to merge 5 commits into
masterfrom
rkaraivanov/fix-17556

Conversation

@rkaraivanov

Copy link
Copy Markdown
Member

Description

The [formField] interop NgControl exposes signal-backed getters only. It has no statusChanges, valueChanges, validator, markAsTouched or setValue, so igxInput, checkbox, switch, radio group, select, combo, simple combo and the date, time and date range pickers threw on init.

Add NgControlAdapter in core as the single access path to the bound NgControl. It detects the backend and derives the missing observables from a root effect over the signal getters, keeping change detection order identical to the observable case. Controls no longer read NgControl internals directly.

Closes #17556

Type of Change (check all that apply):

  • Bug fix

How Has This Been Tested?

  • Unit tests

Checklist:

  • All relevant tags have been applied to this PR
  • This PR includes unit tests covering all the new code (test guidelines)
  • This PR includes CHANGELOG.MD updates for newly added functionality

The `[formField]` interop `NgControl` exposes signal-backed getters
only. It has no `statusChanges`, `valueChanges`, `validator`,
`markAsTouched` or `setValue`, so igxInput, checkbox, switch, radio
group, select, combo, simple combo and the date, time and date range
pickers threw on init.

Add `NgControlAdapter` in core as the single access path to the bound
`NgControl`. It detects the backend and derives the missing observables
from a root effect over the signal getters, keeping change detection
order identical to the observable case. Controls no longer read
`NgControl` internals directly.

Closes #17556
@rkaraivanov
rkaraivanov requested review from ChronosSF and a lite review from Copilot September 2, 2026 13:52
@rkaraivanov rkaraivanov added ❌ status: awaiting-test PRs awaiting manual verification forms forms: validation Forms validation related, including ngModel.status aka VALID/INVALID/TOUCHED/PRISTINE etc. signal-forms labels Sep 2, 2026
@rkaraivanov rkaraivanov added the squash-merge Merge PR with "Squash and Merge" option label Sep 2, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

It introduces a new core abstraction (NgControlAdapter) and updates multiple form controls’ initialization/validation wiring, which warrants final human review despite the added tests.

Pull request overview

This PR fixes initialization/runtime failures when Ignite UI form controls are bound via Angular Signal Forms ([formField]) by routing all NgControl access through a new adapter that normalizes missing observable APIs and control methods in the signal-backed interop control.

Changes:

  • Added NgControlAdapter in core to provide a single, backend-aware access path for NgControl (observable vs signal).
  • Updated multiple form controls (input, checkbox/switch base, radio group, select, combo/simple-combo, date/time pickers) to use the adapter instead of reading NgControl internals directly.
  • Added Signal Forms-focused unit tests for the affected components and updated docs/README/CHANGELOG to document the new compatibility.
File summaries
File Description
skills/igniteui-angular-components/references/form-controls.md Documents how to use Ignite UI controls with Signal Forms via [formField].
projects/igniteui-angular/time-picker/src/time-picker/time-picker.component.ts Uses NgControlAdapter for required/validity/status handling under Signal Forms.
projects/igniteui-angular/time-picker/src/time-picker/time-picker.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/switch/src/switch/switch.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/simple-combo/src/simple-combo/simple-combo.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/select/src/select/select.component.ts Switches status/required/validity logic to the adapter for Signal Forms support.
projects/igniteui-angular/select/src/select/select.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/radio/src/radio/radio-group/radio-group.directive.ts Uses the adapter to safely consume status/required/validators under Signal Forms.
projects/igniteui-angular/radio/src/radio/radio-group/radio-group.directive.spec.ts Adds Signal Forms coverage for required/invalid behaviors.
projects/igniteui-angular/input-group/src/input-group/directives-input/input.directive.ts Uses the adapter for status/value/touched tracking and write/touch interop.
projects/igniteui-angular/input-group/src/input-group/directives-input/input.directive.spec.ts Adds Signal Forms coverage for required/invalid/disabled/reset behaviors.
projects/igniteui-angular/input-group/README.md Notes igxInput compatibility with Signal Forms ([formField]).
projects/igniteui-angular/directives/src/directives/checkbox/checkbox-base.directive.ts Switches checkbox/switch validity & required resolution to the adapter.
projects/igniteui-angular/date-picker/src/date-range-picker/date-range-picker.component.ts Uses the adapter for status/required/validity + signal-backend revalidation hook.
projects/igniteui-angular/date-picker/src/date-range-picker/date-range-picker.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/date-picker/src/date-range-picker/date-range-picker-inputs.common.ts Uses adapter-based setValue handling to support signal-backend “ignored write” semantics.
projects/igniteui-angular/date-picker/src/date-picker/date-picker.component.ts Switches status/required/validity logic to the adapter for Signal Forms support.
projects/igniteui-angular/date-picker/src/date-picker/date-picker.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/core/src/public_api.ts Exports the new NgControlAdapter from the core public API.
projects/igniteui-angular/core/src/core/ng-control-adapter.ts Introduces NgControlAdapter and signal-backed observable derivations via root effects.
projects/igniteui-angular/combo/src/combo/combo.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
projects/igniteui-angular/combo/src/combo/combo.common.ts Switches combo validity/required/status wiring to use the adapter.
projects/igniteui-angular/checkbox/src/checkbox/checkbox.component.spec.ts Adds Signal Forms coverage for required/invalid/disabled behaviors.
CHANGELOG.md Adds an Unreleased entry documenting Signal Forms compatibility across form controls.
Review details
  • Files reviewed: 24/24 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +291 to 295
if (this.control) {
this._statusChanges$ = this.control.statusChanges.subscribe(this.onStatusChanged.bind(this));
this._valueChanges$ = this.control.valueChanges.subscribe(this.onValueChanged.bind(this));
this._touchedChanges$ = this.control.touchedChanges.subscribe(this.updateValidityState.bind(this));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

forms: validation Forms validation related, including ngModel.status aka VALID/INVALID/TOUCHED/PRISTINE etc. forms signal-forms squash-merge Merge PR with "Squash and Merge" option ❌ status: awaiting-test PRs awaiting manual verification

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Signal Forms interop NgControl causes Ignite UI Angular form control initialization failure

5 participants