表單快速入門

2018-08-28 10:30 更新

查看新版Angular 6.x 表單快速入門

主要內(nèi)容

  • 第一節(jié) - 創(chuàng)建最簡單的輸入框
  • 第二節(jié) - 添加簡單的驗證功能
  • 第三節(jié) - 顯示驗證失敗的錯誤信息
  • 第四節(jié) - 創(chuàng)建表單
  • 第五節(jié) - ngModelGroup簡介
  • 第六節(jié) - 表單添加驗證狀態(tài)樣式
  • 第七節(jié) - 表單控件的狀態(tài)
  • 第八節(jié) - 使用單選控件
  • 第九節(jié) - 使用多選控件

閱讀須知

本教程的開發(fā)環(huán)境及開發(fā)語言:

基礎(chǔ)知識

Angular CLI 基本使用

  1. npm install -g @angular/cli

  • 創(chuàng)建新的項目

  1. ng new PROJECT-NAME

  • 啟動本地服務(wù)器

  1. cd PROJECT-NAME
  2. ng serve

Angular Forms 簡介

Angular 4 中有兩種表單:

  • Template Driven Forms - 模板驅(qū)動式表單 (類似于 AngularJS 1.x 中的表單 )
  • Reactive Forms - 響應(yīng)式表單

本文主要介紹 Template Driven Forms (模板驅(qū)動式表單) 的基礎(chǔ)知識,相關(guān)的知識點會以問答的形式進行介紹。

第一節(jié) - 創(chuàng)建最簡單的輸入框

如何實現(xiàn)雙向綁定?

在 Angular 表單中,我們通過 ngModel 指令來實現(xiàn)雙向綁定。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <input type="text" [(ngModel)]="username">
  6. {{username}}
  7. `,
  8. })
  9. export class AppComponent {
  10. username = 'semlinker';
  11. }

第二節(jié) - 添加簡單的驗證功能

如何為表單控件添加驗證功能?

目前 Angular 支持的內(nèi)建 validators 如下:

  • required - 設(shè)置表單控件值是非空的
  • email - 設(shè)置表單控件值的格式是 email
  • minlength - 設(shè)置表單控件值的最小長度
  • maxlength - 設(shè)置表單控件值的最大長度
  • pattern - 設(shè)置表單控件的值需匹配 pattern 對應(yīng)的模式

接下來我們來添加最簡單的 必填 校驗。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <input
  6. type="text"
  7. required
  8. [(ngModel)]="username">
  9. {{username}}
  10. `,
  11. })
  12. export class AppComponent {
  13. username = 'semlinker';
  14. }

如何判斷表單控件是否通過驗證?

在 Angular 中,我們可以通過 #userName="ngModel" 方式獲取 ngModel 對象,然后通過 userName.valid 判斷表單控件是否通過驗證。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <input
  6. type="text"
  7. required
  8. [(ngModel)]="username"
  9. #userName="ngModel">
  10. {{userName.valid}}
  11. `,
  12. })
  13. export class AppComponent {
  14. username = 'semlinker';
  15. }

第三節(jié) - 顯示驗證失敗的錯誤信息

如何顯示驗證失敗的錯誤信息?

在 Angular 中,我們可以通過 #userName="ngModel" 方式獲取 ngModel 對象,然后通過該對象的 errors 屬性,來獲取對應(yīng)驗證規(guī)則 (如 required, minlength 等) 的驗證狀態(tài)。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <input
  6. type="text"
  7. required
  8. minlength="3"
  9. [(ngModel)]="username"
  10. #userName="ngModel">
  11. <hr>
  12. <div *ngIf="userName.errors?.required">請您輸入用戶名</div>
  13. <div *ngIf="userName.errors?.minlength">
  14. 用戶名的長度必須大于 {{userName.errors?.minlength.requiredLength}},當(dāng)前的長度為
  15. {{userName.errors?.minlength.actualLength}}
  16. </div>
  17. `,
  18. })
  19. export class AppComponent {
  20. username = 'semlinker';
  21. }

第四節(jié) - 創(chuàng)建表單

如何使用表單?

在 Angular 中,我們可以使用熟悉的 <form> 標(biāo)簽來創(chuàng)建表單。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <form>
  6. <input
  7. type="text"
  8. required
  9. minlength="3"
  10. name="username"
  11. [(ngModel)]="username"
  12. #userName="ngModel">
  13. <hr>
  14. <div *ngIf="userName.errors?.required">請您輸入用戶名</div>
  15. <div *ngIf="userName.errors?.minlength">
  16. 用戶名的長度必須大于 {{userName.errors?.minlength.requiredLength}},當(dāng)前的長度為
  17. {{userName.errors?.minlength.actualLength}}
  18. </div>
  19. <button type="submit">提交</button>
  20. </form>
  21. `,
  22. })
  23. export class AppComponent {
  24. username = 'semlinker';
  25. }

需要注意的是,在使用 <form> 標(biāo)簽后,我們的 username 輸入框,必須添加 name 屬性。

如何獲取表單提交的值?

在 Angular 中,我們可以通過 #loginForm="ngForm" 方式獲取 ngForm 對象,然后通過 loginForm.value 來獲取表單的值。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm.value)">
  6. <input
  7. type="text"
  8. required
  9. minlength="3"
  10. name="username"
  11. [(ngModel)]="username"
  12. #userName="ngModel">
  13. <hr>
  14. <div *ngIf="userName.errors?.required">請您輸入用戶名</div>
  15. <div *ngIf="userName.errors?.minlength">
  16. 用戶名的長度必須大于 {{userName.errors?.minlength.requiredLength}},當(dāng)前的長度為
  17. {{userName.errors?.minlength.actualLength}}
  18. </div>
  19. <button type="submit">提交</button>
  20. {{loginForm.value | json}}
  21. </form>
  22. `,
  23. })
  24. export class AppComponent {
  25. username = 'semlinker';
  26. onSubmit(value) {
  27. console.dir(value);
  28. }
  29. }

第五節(jié) - ngModelGroup簡介

ngModelGroup 有什么作用?

ngModelGroup 指令是 Angular 表單中提供的另一特殊指令,可以對表單輸入內(nèi)容進行分組,方便我們在語義上區(qū)分不同性質(zhì)的輸入。例如聯(lián)系人的信息包括姓名及住址,現(xiàn)在需對姓名和住址進行精細(xì)化信息收集,姓名可精細(xì)化成姓和名字,地址可精細(xì)化成城市、區(qū)、街等。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm.value)">
  6. <fieldset ngModelGroup="user">
  7. <input
  8. type="text"
  9. required
  10. minlength="3"
  11. name="username"
  12. [(ngModel)]="username"
  13. #userName="ngModel">
  14. <hr>
  15. <div *ngIf="userName.errors?.required">請您輸入用戶名</div>
  16. <div *ngIf="userName.errors?.minlength">
  17. 用戶名的長度必須大于 {{userName.errors?.minlength.requiredLength}},當(dāng)前的長度為
  18. {{userName.errors?.minlength.actualLength}}
  19. </div>
  20. <input type="password" ngModel name="password">
  21. </fieldset>
  22. <button type="submit">提交</button>
  23. <hr>
  24. {{loginForm.value | json}}
  25. </form>
  26. `,
  27. })
  28. export class AppComponent {
  29. username = 'semlinker';
  30. onSubmit(value) {
  31. console.dir(value);
  32. }
  33. }

以上代碼成功運行后,{{loginForm.value | json}} 的輸出結(jié)果:

  1. { "user": { "username": "semlinker", "password": "123" } }

第六節(jié) - 表單添加驗證狀態(tài)樣式

如何為表單添加驗證狀態(tài)樣式信息?

在 Angular 表單中,若驗證通過則會在表單控件上添加 ng-valid 類,若驗證失敗則會在表單控件上添加 ng-invalid 類。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. styles: [`
  5. input.ng-invalid {
  6. border: 3px solid red;
  7. }
  8. input.ng-valid {
  9. border: 3px solid green;
  10. }
  11. `
  12. ],
  13. template: `
  14. <form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm.value)">
  15. <fieldset ngModelGroup="user">
  16. <input
  17. type="text"
  18. required
  19. minlength="3"
  20. name="username"
  21. [(ngModel)]="username"
  22. #userName="ngModel">
  23. <hr>
  24. <div *ngIf="userName.errors?.required">請您輸入用戶名</div>
  25. <div *ngIf="userName.errors?.minlength">
  26. 用戶名的長度必須大于 {{userName.errors?.minlength.requiredLength}},當(dāng)前的長度為
  27. {{userName.errors?.minlength.actualLength}}
  28. </div>
  29. <input type="password" required ngModel name="password">
  30. </fieldset>
  31. <button type="submit">提交</button>
  32. <hr>
  33. {{loginForm.value | json}}
  34. </form>
  35. `,
  36. })
  37. export class AppComponent {
  38. username = 'semlinker';
  39. onSubmit(value) {
  40. console.dir(value);
  41. }
  42. }

第七節(jié) - 表單控件的狀態(tài)

表單控件除了 valid 狀態(tài)外,還包含哪些狀態(tài)?

在 Angular 中表單控件有以下 6 種狀態(tài),我們可以通過 #userName="ngModel" 方式獲取 ngModel 對象,進而獲取控件的狀態(tài)信息。具體狀態(tài)如下:

  • valid - 表單控件有效
  • invalid - 表單控件無效
  • pristine - 表單控件值未改變
  • dirty - 表單控件值已改變
  • touched - 表單控件已被訪問過
  • untouched - 表單控件未被訪問過

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. styles: [`
  5. input.ng-invalid {
  6. border: 3px solid red;
  7. }
  8. input.ng-valid {
  9. border: 3px solid green;
  10. }
  11. `
  12. ],
  13. template: `
  14. <form #loginForm="ngForm" (ngSubmit)="onSubmit(loginForm.value)">
  15. <fieldset ngModelGroup="user">
  16. <input
  17. type="text"
  18. required
  19. minlength="3"
  20. name="username"
  21. [(ngModel)]="username"
  22. #userName="ngModel">
  23. <hr>
  24. <p>Name控件的valid狀態(tài):{{userName.valid}} - 表示控件有效</p>
  25. <p>Name控件的invalid狀態(tài):{{userName.invalid}} - 表示控件無效</p>
  26. <p>Name控件的pristine狀態(tài):{{userName.pristine}} - 表示控件值未改變</p>
  27. <p>Name控件的dirty狀態(tài):{{userName.dirty}} - 表示控件值已改變</p>
  28. <p>Name控件的touched狀態(tài):{{userName.touched}} - 表示控件已被訪問過</p>
  29. <p>Name控件的untouched狀態(tài):{{userName.untouched}} - 表示控件未被訪問過</p>
  30. <div *ngIf="userName.errors?.required">請您輸入用戶名</div>
  31. <div *ngIf="userName.errors?.minlength">
  32. 用戶名的長度必須大于 {{userName.errors?.minlength.requiredLength}},當(dāng)前的長度為
  33. {{userName.errors?.minlength.actualLength}}
  34. </div>
  35. <input type="password" required ngModel name="password">
  36. </fieldset>
  37. <button type="submit">提交</button>
  38. <hr>
  39. {{loginForm.value | json}}
  40. </form>
  41. `,
  42. })
  43. export class AppComponent {
  44. username = 'semlinker';
  45. onSubmit(value) {
  46. console.dir(value);
  47. }
  48. }

第八節(jié) - 使用單選控件

如何添加單選控件?

在 Angular 中,我們通過 <input name="***" type="radio"> 方式添加單選控件。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <form #loginForm="ngForm">
  6. Angular版本:
  7. <div *ngFor="let version of versions;">
  8. <input
  9. [attr.id]="version"
  10. name="version"
  11. ngModel
  12. required
  13. [value]="version"
  14. type="radio">
  15. <label [attr.for]="version">{{version}}</label>
  16. </div>
  17. <hr>
  18. {{loginForm.value | json}}
  19. </form>
  20. `,
  21. })
  22. export class AppComponent {
  23. versions = ['1.x', '2.x', '3.x'];
  24. }

第九節(jié) - 使用多選控件

如何添加多選控件?

在 Angular 中,我們通過 <select name="***"> 方式添加多選控件。

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. template: `
  5. <form #loginForm="ngForm">
  6. Angular版本:
  7. <select name="version" [ngModel]="versions[0]">
  8. <option
  9. *ngFor="let version of versions;"
  10. [value]="version">
  11. {{version}}
  12. </option>
  13. </select>
  14. <hr>
  15. {{loginForm.value | json}}
  16. </form>
  17. `,
  18. })
  19. export class AppComponent {
  20. versions = ['1.x', '2.x', '3.x'];
  21. }

如何添加必填驗證?

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'app-root',
  4. styles: [`
  5. select.ng-invalid + label:after {
  6. content: '<-- 請選擇版本!'
  7. }
  8. `
  9. ],
  10. template: `
  11. <form #loginForm="ngForm">
  12. Angular版本:
  13. <div>
  14. <select name="version" [ngModel]="version" required>
  15. <option
  16. *ngFor="let version of versions;"
  17. [value]="version">
  18. {{version}}
  19. </option>
  20. </select>
  21. <label></label>
  22. </div>
  23. <hr>
  24. {{loginForm.value | json}}
  25. </form>
  26. `,
  27. })
  28. export class AppComponent {
  29. versions = ['','1.x', '2.x', '3.x'];
  30. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號