注:涉及input表單時要在AppComponent中引入 FormsModule模塊:
import{ FormsModule } from '@angular/forms'; @NgModule({ imports: [BrowserModule, FormsModule],})
目錄:
1、在 Angular 表單中,通過 [(ngModel)]="username" 指令來實現數據雙向綁定
2、添加簡單的驗證功能
3、顯示表單驗證失敗的錯誤信息
4、創建表單(添加name屬性)
5、獲取表單提交的值
6、對表單輸入內容進行分組 ngModelGroup
7、為表單的驗證狀態添加樣式信息
8、為表單的驗證狀態添加樣式信息
9、使用單選控件
10、使用多選控件
11、為多選控件添加必填驗證
<!-- 下面的代碼均是html中,同時在typescript中要定義username的初始值 --> username = 'semlinker';
1、簡單的輸入框(雙向綁定)
在angular表單中通過 ngModel 指令來實現雙向綁定。
1 <!-- 1、在 Angular 表單中,通過 [(ngModel)]="username" 指令來實現數據雙向綁定 --> 2 3 <input type="text" name="111" [(ngModel)]="username"> 4 {{username}} <!-- 獲取輸入框中輸入的值 -->
2、表單驗證功能
(1)目前 Angular 支持的內建 validators 如下:
-
-
required - 表單控件值是必填的
-
email - 表單控件值的格式是 email
-
minlength - 表單控件值的最小長度
-
maxlength - 表單控件值的最大長度
-
pattern - 表單控件的值需匹配 pattern 對應的模式
-
(2)如何判斷表單控件是否通過驗證?
在 Angular 中,我們可以通過 #userName="ngModel" 方式獲取 ngModel 對象,然后通過 userName.valid 判斷表單控件是否通過驗證。
3 <!-- 2、添加簡單的驗證功能 --> 4 <input type="text" required [(ngModel)]="username" #userName="ngModel">{{userName.valid}}
3、顯示驗證失敗的錯誤信息
在 Angular 中,可以通過 #userName="ngModel" 方式獲取 ngModel 對象,然后通過該對象的 errors 屬性,來獲取對應驗證規則 (如 required, minlength 等) 的驗證狀態。
1 <!-- 3、顯示表單驗證失敗的錯誤信息 --> 2 <input type="text" required minlength="3" [(ngModel)]="username" #userName="ngModel"> <!-- 必填、最小長度為3 --> 3 <div *ngIf="userName.errors?.required">請您輸入用戶名</div> <!-- 輸入框為空時提示“請輸入用戶名” --> 4 <div *ngIf="userName.errors?.minlength"> <!-- 長度小於最小長度時提示“用戶名長度必須大於xx,當前長度xx” --> 5 用戶名的長度必須大於 {{userName.errors?.minlength.requiredLength}},當前的長度為{{userName.errors?.minlength.actualLength}} 6 </div>
4、創建表單
使用<form> 標簽來創建表單,一定要注意在使用 <form> 標簽后,我們的 input 輸入框,必須添加 name 屬性。
1 <!-- 4、創建表單(添加name屬性) --> 2 <form> 3 <input name="userName" type="text" required minlength="3"[(ngModel)]="username" #userName="ngModel"> 4 <div *ngIf="userName.errors?.required">請您輸入用戶名</div> 5 <div *ngIf="userName.errors?.minlength"> 6 用戶名的長度必須大於 {{userName.errors?.minlength.requiredLength}},當前的長度為{{userName.errors?.minlength.actualLength}} 7 </div> 8 <button type="submit">提交</button> 9 </form>
5、獲取表單提交的值
在 Angular 中,我們可以通過 #loginForm="ngForm" 方式獲取 ngForm 對象,然后通過 loginForm.value 來獲取表單的值。
1 <!-- 5、獲取表單提交的值 --> 2 <form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm.value)"> 3 <input type="text" required minlength="3" name="username" [(ngModel)]="username" #userName="ngModel"> 4 <div *ngIf="userName.errors?.required">請您輸入用戶名</div> 5 <div *ngIf="userName.errors?.minlength"> 6 用戶名的長度必須大於 {{userName.errors?.minlength.requiredLength}},當前的長度為{{userName.errors?.minlength.actualLength}} 7 </div> 8 <button type="submit">提交</button> 9 {{loginForm.value | json}} 10 </form>
11 <!-- typescript的內容 --> 12 export class AppComponent { 13 username = 'semlinker'; 14 15 onSubmit(value) { 16 console.log(value); //打印出來是輸入框的值 17 }
打印結果: 
6、對表單輸入內容進行分組 ngModelGroup
ngModelGroup 指令是 Angular 表單中提供的另一特殊指令,可以對表單輸入內容進行分組,方便我們在語義上區分不同性質的輸入。
例如聯系人的信息包括姓名及住址,現在需對姓名和住址進行精細化信息收集,姓名可精細化成姓和名字,地址可精細化成城市、區、街等。
1 <!-- 6、對表單輸入內容進行分組 ngModelGroup --> 2 <form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm.value)"> 3 <fieldset ngModelGroup="user"> 4 <input type="text" required minlength="3" name="username" [(ngModel)]="username" #userName="ngModel"> 5 <div *ngIf="userName.errors?.required">請您輸入用戶名</div> 6 <div *ngIf="userName.errors?.minlength"> 7 用戶名的長度必須大於 {{userName.errors?.minlength.requiredLength}},當前的長度為 {{userName.errors?.minlength.actualLength}} 8 </div> 9 <input type="password" ngModel name="password"> 10 </fieldset> 11 <button type="submit">提交</button> 12 {{loginForm.value | json}} 13 </form> 14 15 <!-- typescript --> 16 export class AppComponent { 17 username = 'semlinker'; 18 19 onSubmit(value) { 20 console.dir(value); 21 } 22 }
以上代碼成功運行后,{{loginForm.value | json}} 和控制台的輸出結果:{ "user": { "username": "semlinker", "password": "123" } }
7、為表單的驗證狀態添加樣式信息
在 Angular 表單中,若驗證通過則會在表單控件上添加 ng-valid 類,若驗證失敗則會在表單控件上添加 ng-invalid 類。
1 <!-- 7、為表單的驗證狀態添加樣式信息 --> 2 <!-- 在上例的基礎上添加 css 代碼 --> 3 4 input.ng-invalid { 5 border: 3px solid red; 6 } 7 input.ng-valid { 8 border: 3px solid green; 9 }
8、表單控件的狀態
在 Angular 中可以通過 #userName="ngModel" 方式獲取 ngModel 對象,進而獲取控件的狀態信息。
表單控件有以下 6 種狀態:
-
-
valid - 表單控件有效
-
invalid - 表單控件無效
-
pristine - 表單控件值未改變
-
dirty - 表單控件值已改變
-
touched - 表單控件已被訪問過
-
untouched - 表單控件未被訪問過
-
1 <!-- 8、為表單的驗證狀態添加樣式信息 --> 2 <input type="text" [(ngModel)]="username" #userName="ngModel"> 3 4 <p>Name控件的valid狀態:{{userName.valid}} - 表示控件有效</p> 5 <p>Name控件的invalid狀態:{{userName.invalid}} - 表示控件無效</p> 6 <p>Name控件的pristine狀態:{{userName.pristine}} - 表示控件值未改變</p> 7 <p>Name控件的dirty狀態:{{userName.dirty}} - 表示控件值已改變</p> 8 <p>Name控件的touched狀態:{{userName.touched}} - 表示控件已被訪問過</p> 9 <p>Name控件的untouched狀態:{{userName.untouched}} - 表示控件未被訪問過</p>
9、使用單選控件
在 Angular 中,我們通過 <input name="***" type="radio"> 方式添加單選控件。
1 <!-- 9、使用單選控件 --> 2 <form #loginForm="ngForm"> 3 <div *ngFor="let color of colors;"> 4 <input [attr.id]="color" name="color" ngModel required [value]="color" type="radio"> 5 <label [attr.for]="color">{{color}}</label> 6 </div> 7 {{loginForm.value | json}} 8 </form> 9 10 <!-- typescript --> 11 export class AppComponent { 12 colors = ['紅色', '黃色', '藍色]; 13 }
9 <p>Name控件的untouched狀態:{{userName.untouched}} - 表示控件未被訪問過</p>
10、使用多選控件
在 Angular 中,通過 <select name="***"> 方式添加多選控件。
1 <!-- 10、使用多選控件 --> 2 <form #loginForm="ngForm"> 3 <select name="color" [ngModel]="colors[0]"> 4 <option *ngFor="let color of colors;" [value]="color"> 5 {{color}} 6 </option> 7 </select> 8 {{loginForm.value | json}} 9 </form> 10 11 <!-- typescript --> 12 export class AppComponent { 13 colors = ['紅色', '黃色', '藍色]; 14 }
11、為多選控件添加必填驗證
1 <!-- 11、為多選控件添加必填驗證 --> 2 <form #loginForm="ngForm"> 3 <div> 4 <select name="color" [ngModel]="colors[0]" required> 5 <option *ngFor="let color of colors;" [value]="color"> 6 {{color}} 7 </option> 8 </select> 9 <label></label> 10 </div> 11 {{loginForm.value | json}} 12 </form> 13 14 <!-- css --> 15 select.ng-invalid + label:after { 16 content: '<-- 請做出選擇!' 17 } 18 19 <!-- typescript --> 20 export class AppComponent { 21 colors = ['紅色', '黃色', '藍色]; 22 }
