angular-forms
Handles form creation, validation, and reactive logic in Angular applications.
Install
mkdir -p .claude/skills/angular-forms && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/11511" && unzip -o skill.zip -d .claude/skills/angular-forms && rm skill.zipInstalls to .claude/skills/angular-forms
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
ALWAYS use when working with Angular Forms, reactive forms, template-driven forms, form validation, or form handling in Angular applications.Key capabilities
- →Create reactive forms with validation.
- →Implement functional validators for form fields.
- →Manage complex form groups and arrays.
- →Handle form submission and data retrieval.
- →Control form field states like disabled or touched.
How it works
The skill provides utilities for managing Angular forms, including reactive forms, template-driven forms, and validation, using the `@angular/forms` module.
Inputs & outputs
When to use angular-forms
- →Create reactive forms with validation
- →Implement functional validators
- →Manage complex form groups and arrays
About this skill
@angular/forms
Version: Angular 21 (2025) Tags: Forms, Validation, Reactive Forms, Template-Driven
References: Reactive Forms • Template-Driven • API
API Changes
This section documents recent version-specific API changes.
-
NEW: Signal-based form controls — Angular 19+ signal integration for form controls
-
NEW: Functional validators — Prefer functional validators over class-based validators
-
NEW:
AbstractControl.markAllAsTouched()— New method to mark all controls as touched -
NEW:
nonNullableoption — Create non-nullable FormControls -
NEW: Typed forms — Full TypeScript support for form groups and arrays
-
DEPRECATED: Class-based validators — Migrate to functional validators
Best Practices
- Use Reactive Forms for complex forms — Better structure, validation, and testability
import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
@Component({
standalone: true,
imports: [ReactiveFormsModule],
template: `
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<input formControlName="email" />
<div *ngIf="form.controls.email.invalid && form.controls.email.touched">
Email is required
</div>
</form>
`
})
export class LoginComponent {
private fb = inject(FormBuilder);
form = this.fb.nonNullable.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(8)]]
});
onSubmit() {
if (this.form.valid) {
console.log(this.form.getRawValue());
}
}
}
- Use FormBuilder for cleaner code
form = this.fb.group({
name: ['', Validators.required],
email: ['', [Validators.required, Validators.email]],
address: this.fb.group({
street: [''],
city: ['']
})
});
- Use custom validators for complex logic
// Functional validator (preferred)
const forbiddenNameValidator = (control: AbstractControl): ValidationErrors | null => {
const forbidden = ['admin', 'root', 'superuser'];
return forbidden.includes(control.value) ? { forbiddenName: true } : null;
};
// Usage
name: ['', forbiddenNameValidator]
- Use async validators for server-side validation
email: ['',
[Validators.email],
[asyncValidator, { debounceTime: 300 }]
]
- Use FormArray for dynamic form fields
const form = this.fb.group({
emails: this.fb.array([
this.fb.control('')
])
});
get emails(): FormArray {
return this.form.get('emails') as FormArray;
}
addEmail() {
this.emails.push(this.fb.control(''));
}
- Use
updateOnoption for performance
// Only validate on blur
email: ['', { updateOn: 'blur' }]
// Only validate on submit
password: ['', { updateOn: 'submit' }]
- Show validation errors conditionally
<input formControlName="email"
[class.is-invalid]="email.invalid && (email.dirty || email.touched)" />
- Use disable() for conditionally disabled fields
// Disable based on another control
this.form.statusChanges.subscribe(() => {
if (this.form.value.isAdmin) {
this.form.controls.permissions.enable();
} else {
this.form.controls.permissions.disable();
}
});
- Reset form properly
// Reset with default values
this.form.reset({ email: '', name: 'Default' });
// Reset and clear validators
this.form.reset();
this.form.clearValidators();
When not to use it
- →When working with forms in non-Angular applications.
Limitations
- →Applicable only to Angular applications.
How it compares
This skill offers structured, framework-specific tools for form management, contrasting with manual DOM manipulation or generic JavaScript form handling.
Compared to similar skills
angular-forms side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| angular-forms (this skill) | 0 | 5mo | No flags | Beginner |
| angular | 100 | 4mo | Review | Advanced |
| angular-state-management | 8 | 4mo | No flags | Intermediate |
| angular-modernization | 4 | 8mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
angular
sickn33
Modern Angular (v20+) expert with deep knowledge of Signals, Standalone Components, Zoneless applications, SSR/Hydration, and reactive patterns. Use PROACTIVELY for Angular development, component architecture, state management, performance optimization, and migration to modern patterns.
angular-state-management
sickn33
Master modern Angular state management with Signals, NgRx, and RxJS. Use when setting up global state, managing component stores, choosing between state solutions, or migrating from legacy patterns.
angular-modernization
bitwarden
Modernizes Angular code such as components and directives to follow best practices using both automatic CLI migrations and Bitwarden-specific patterns. YOU must use this skill when someone requests modernizing Angular code. DO NOT invoke for general Angular discussions unrelated to modernization.
angular-routing
analogjs
Implement routing in Angular v20+ applications with lazy loading, functional guards, resolvers, and route parameters. Use for navigation setup, protected routes, route-based data loading, and nested routing. Triggers on route configuration, adding authentication guards, implementing lazy loading, or reading route parameters with signals.
igniteui-angular-grids
igniteui
Provides guidance on all Ignite UI for Angular data grid types (Flat Grid, Tree Grid, Hierarchical Grid, Grid Lite, Pivot Grid) including setup, column configuration, sorting, filtering, selection, editing, grouping, summaries, toolbar, export, paging, remote data, and state persistence. Use when users ask about grids, tables, data grids, tabular data display, cell editing, batch editing, row selection, column pinning, column hiding, grouping rows, pivot tables, tree-structured data, hierarchical data, master-detail views, or exporting grid data.
igniteui-angular-components
igniteui
Provides guidance on all non-grid Ignite UI for Angular UI components including application setup and architecture, form controls (Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider, reactive forms), layout (Tabs, Bottom Navigation, Stepper, Accordion, Splitter, Navigation Drawer, Layout Manager), data display (List, Tree, Card, Chips, Avatar, Badge, Icon, Carousel, Paginator, Progress Bar, Linear Progress Bar, Circular Progress Bar, Chat), feedback/overlays (Dialog, Snackbar, Toast, Banner), directives (Button, Ripple, Tooltip, Drag and Drop), Dock Manager, and Charts (Area Chart, Bar Chart, Column Chart, Stock/Financial Chart, Pie Chart, IgxCategoryChart, IgxFinancialChart, IgxDataChart, IgxPieChart). Use when users ask about any Ignite UI Angular component that is not a data grid, such as forms, inputs, dropdowns, date pickers, dialogs, navigation, lists, trees, cards, charts, or application scaffolding and setup.