From ddd3198dc261c677282c8d24672673d7f176e774 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Thu, 22 Jan 2026 14:05:46 +0100 Subject: [PATCH] docs: update signal form tutorials to use `FormField` --- .../playground/4-signal-forms/src/main.ts | 10 +++---- .../steps/2-connect-form-template/README.md | 28 +++++++++---------- .../answer/src/app/app.html | 6 ++-- .../answer/src/app/app.ts | 6 ++-- .../2-connect-form-template/src/app/app.html | 6 ++-- .../2-connect-form-template/src/app/app.ts | 6 ++-- .../steps/3-add-validation/README.md | 2 +- .../3-add-validation/answer/src/app/app.html | 6 ++-- .../3-add-validation/answer/src/app/app.ts | 6 ++-- .../steps/3-add-validation/src/app/app.html | 6 ++-- .../steps/3-add-validation/src/app/app.ts | 6 ++-- .../steps/4-display-errors/README.md | 4 +-- .../4-display-errors/answer/src/app/app.html | 6 ++-- .../4-display-errors/answer/src/app/app.ts | 6 ++-- .../steps/4-display-errors/src/app/app.html | 6 ++-- .../steps/4-display-errors/src/app/app.ts | 6 ++-- .../steps/5-add-submission/README.md | 2 +- .../5-add-submission/answer/src/app/app.html | 6 ++-- .../5-add-submission/answer/src/app/app.ts | 6 ++-- .../steps/5-add-submission/src/app/app.html | 6 ++-- .../steps/5-add-submission/src/app/app.ts | 6 ++-- .../signal-forms/steps/6-next-steps/README.md | 2 +- 22 files changed, 72 insertions(+), 72 deletions(-) diff --git a/adev/src/content/tutorials/playground/4-signal-forms/src/main.ts b/adev/src/content/tutorials/playground/4-signal-forms/src/main.ts index 67c2b3facf2..9c24b706035 100644 --- a/adev/src/content/tutorials/playground/4-signal-forms/src/main.ts +++ b/adev/src/content/tutorials/playground/4-signal-forms/src/main.ts @@ -1,6 +1,6 @@ +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +import {email, form, FormField, required, submit} from '@angular/forms/signals'; import {bootstrapApplication} from '@angular/platform-browser'; -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -import {form, Field, required, email, debounce, submit} from '@angular/forms/signals'; interface LoginData { email: string; @@ -14,7 +14,7 @@ interface LoginData {
@if (loginForm.email().invalid()) { @@ -29,7 +29,7 @@ interface LoginData {
@if (loginForm.password().invalid()) { @@ -45,7 +45,7 @@ interface LoginData { `, styleUrl: 'main.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class LoginApp { diff --git a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/README.md b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/README.md index de371dc11e8..e72b9d32a6e 100644 --- a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/README.md +++ b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/README.md @@ -1,11 +1,11 @@ # Connect your form to the template -Now, you need to connect your form to the template using the `[field]` directive. This creates two-way data binding between your form model and the input elements. +Now, you need to connect your form to the template using the `[formField]` directive. This creates two-way data binding between your form model and the input elements. In this lesson, you'll learn how to: -- Import the `Field` directive -- Use the `[field]` directive to bind form fields to inputs +- Import the `FormField` directive +- Use the `[formField]` directive to bind form fields to inputs - Connect text inputs and checkboxes to your form - Display form field values in the template @@ -15,17 +15,17 @@ Let's wire up the template! - -Import the `Field` directive from `@angular/forms/signals` and add it to your component's imports array: + +Import the `FormField` directive from `@angular/forms/signals` and add it to your component's imports array: ```ts -import { form, Field } from '@angular/forms/signals'; +import { form, FormField } from '@angular/forms/signals'; @Component({ selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) ``` @@ -33,29 +33,29 @@ import { form, Field } from '@angular/forms/signals'; -In your template, add the `[field]` directive to the email input: +In your template, add the `[formField]` directive to the email input: ```html - + ``` The `loginForm.email` expression accesses the email field from your form. -Add the `[field]` directive to the password input: +Add the `[formField]` directive to the password input: ```html - + ``` -Add the `[field]` directive to the checkbox input: +Add the `[formField]` directive to the checkbox input: ```html - + ``` @@ -74,6 +74,6 @@ Form field values are signals, so the displayed values update automatically as y -Great work! You've connected your form to the template and displayed the form values. The `[field]` directive handles two-way data binding automatically - as you type, the `loginModel` signal updates, and the displayed values update immediately. +Great work! You've connected your form to the template and displayed the form values. The `[formField]` directive handles two-way data binding automatically - as you type, the `loginModel` signal updates, and the displayed values update immediately. Next, you'll learn [how to add validation to your form](/tutorials/signal-forms/3-add-validation)! diff --git a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.html index 607367d7d86..68608b704b6 100644 --- a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.html @@ -2,20 +2,20 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.ts index dc83f2e52d3..7767afdaa0b 100644 --- a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/answer/src/app/app.ts @@ -1,5 +1,5 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -import {form, Field} from '@angular/forms/signals'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +import {form, FormField} from '@angular/forms/signals'; interface LoginData { email: string; @@ -11,7 +11,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.html index c64a775de1a..37b0011962f 100644 --- a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.html @@ -2,7 +2,7 @@
@@ -10,14 +10,14 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.ts index f6f61af4ebf..09f47f139dc 100644 --- a/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/2-connect-form-template/src/app/app.ts @@ -1,5 +1,5 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -// TODO: Import Field directive from @angular/forms/signals +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +// TODO: Import FormField directive from @angular/forms/signals import {form} from '@angular/forms/signals'; interface LoginData { @@ -12,7 +12,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - // TODO: Add Field to imports array + // TODO: Add FormField to imports array changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/README.md b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/README.md index c9074275000..91163312310 100644 --- a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/README.md +++ b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/README.md @@ -18,7 +18,7 @@ Let's add validation! Import the `required` and `email` validators from `@angular/forms/signals`: ```ts -import {form, Field, required, email} from '@angular/forms/signals'; +import {form, FormField, required, email} from '@angular/forms/signals'; ``` diff --git a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.html index 607367d7d86..68608b704b6 100644 --- a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.html @@ -2,20 +2,20 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.ts index 66a5c126786..d6b10a44c24 100644 --- a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/answer/src/app/app.ts @@ -1,5 +1,5 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -import {form, Field, required, email} from '@angular/forms/signals'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +import {email, form, FormField, required} from '@angular/forms/signals'; interface LoginData { email: string; @@ -11,7 +11,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.html index 607367d7d86..68608b704b6 100644 --- a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.html @@ -2,20 +2,20 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.ts index 1b1de77669a..5ade0560ddb 100644 --- a/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/3-add-validation/src/app/app.ts @@ -1,6 +1,6 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; // TODO: Import required and email validators -import {form, Field} from '@angular/forms/signals'; +import {form, FormField} from '@angular/forms/signals'; interface LoginData { email: string; @@ -12,7 +12,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/README.md b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/README.md index 39facf6eee6..f5b4e95e986 100644 --- a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/README.md +++ b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/README.md @@ -21,7 +21,7 @@ Below the email input, add conditional error display. This will only show errors ```angular-html @if (loginForm.email().invalid() && loginForm.email().touched()) {
@@ -41,7 +41,7 @@ Below the password input, add the same pattern for password errors: ```angular-html @if (loginForm.password().invalid() && loginForm.password().touched()) {
diff --git a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.html index 33a835f483d..fa43ea05c0c 100644 --- a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.html @@ -2,7 +2,7 @@
@if (loginForm.email().invalid() && loginForm.email().touched()) {
@@ -16,7 +16,7 @@
@if (loginForm.password().invalid() && loginForm.password().touched()) {
@@ -29,7 +29,7 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.ts index 66a5c126786..d6b10a44c24 100644 --- a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/answer/src/app/app.ts @@ -1,5 +1,5 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -import {form, Field, required, email} from '@angular/forms/signals'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +import {email, form, FormField, required} from '@angular/forms/signals'; interface LoginData { email: string; @@ -11,7 +11,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.html index 526fccf4f51..877ebdec5af 100644 --- a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.html @@ -2,7 +2,7 @@
@@ -12,7 +12,7 @@
@@ -21,7 +21,7 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.ts index 66a5c126786..d6b10a44c24 100644 --- a/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/4-display-errors/src/app/app.ts @@ -1,5 +1,5 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -import {form, Field, required, email} from '@angular/forms/signals'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +import {email, form, FormField, required} from '@angular/forms/signals'; interface LoginData { email: string; @@ -11,7 +11,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/README.md b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/README.md index 678062d4e59..36f8585f5d7 100644 --- a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/README.md +++ b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/README.md @@ -19,7 +19,7 @@ Let's complete the form! Import the `submit` function from `@angular/forms/signals`: ```ts -import {form, Field, required, email, submit} from '@angular/forms/signals'; +import {form, FormField, required, email, submit} from '@angular/forms/signals'; ``` diff --git a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.html index 441032c934a..ea1aaee2727 100644 --- a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.html @@ -2,7 +2,7 @@
@if (loginForm.email().invalid() && loginForm.email().touched()) {
@@ -16,7 +16,7 @@
@if (loginForm.password().invalid() && loginForm.password().touched()) {
@@ -29,7 +29,7 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.ts index f85d5b0f5f9..ba9f0689d0e 100644 --- a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/answer/src/app/app.ts @@ -1,5 +1,5 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; -import {form, Field, required, email, submit} from '@angular/forms/signals'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; +import {email, form, FormField, required, submit} from '@angular/forms/signals'; interface LoginData { email: string; @@ -11,7 +11,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.html b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.html index 9025d7cf1d9..81d0acd62bb 100644 --- a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.html +++ b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.html @@ -3,7 +3,7 @@
@if (loginForm.email().invalid() && loginForm.email().touched()) {
@@ -17,7 +17,7 @@
@if (loginForm.password().invalid() && loginForm.password().touched()) {
@@ -30,7 +30,7 @@
diff --git a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.ts b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.ts index b0f3b34b194..7c0197ace99 100644 --- a/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.ts +++ b/adev/src/content/tutorials/signal-forms/steps/5-add-submission/src/app/app.ts @@ -1,6 +1,6 @@ -import {Component, signal, ChangeDetectionStrategy} from '@angular/core'; +import {ChangeDetectionStrategy, Component, signal} from '@angular/core'; // TODO: Import submit function -import {form, Field, required, email} from '@angular/forms/signals'; +import {email, form, FormField, required} from '@angular/forms/signals'; interface LoginData { email: string; @@ -12,7 +12,7 @@ interface LoginData { selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', - imports: [Field], + imports: [FormField], changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { diff --git a/adev/src/content/tutorials/signal-forms/steps/6-next-steps/README.md b/adev/src/content/tutorials/signal-forms/steps/6-next-steps/README.md index d3d8d39a55d..86b156c4cbc 100644 --- a/adev/src/content/tutorials/signal-forms/steps/6-next-steps/README.md +++ b/adev/src/content/tutorials/signal-forms/steps/6-next-steps/README.md @@ -7,7 +7,7 @@ You've completed the Signal Forms tutorial and built a complete login form from Throughout this tutorial, you learned the fundamentals of Angular Signal Forms: 1. **Form Models** - Creating type-safe form data with signals and the `form()` function -2. **Field Binding** - Using the `[field]` directive for two-way data binding and displaying the field with `value()` +2. **Field Binding** - Using the `[formField]` directive for two-way data binding and displaying the field with `value()` 3. **Validation** - Applying built-in validators (such as `required()`, `email()`) with custom messages 4. **Error Display** - Showing validation errors conditionally based on field state 5. **Form Submission** - Handling form submission with the `submit()` function