新聞中心
響應(yīng)式表單
響應(yīng)式表單提供了一種模型驅(qū)動的方式來處理表單輸入,其中的值會隨時間而變化。本文會向你展示如何創(chuàng)建和更新基本的表單控件,接下來還會在一個表單組中使用多個控件,驗證表單的值,以及創(chuàng)建動態(tài)表單,也就是在運(yùn)行期添加或移除控件。

站在用戶的角度思考問題,與客戶深入溝通,找到金沙網(wǎng)站設(shè)計與金沙網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋金沙地區(qū)。
試試這個響應(yīng)式表單的現(xiàn)場演練 / 下載范例。
響應(yīng)式表單概述
響應(yīng)式表單使用顯式的、不可變的方式,管理表單在特定的時間點上的狀態(tài)。對表單狀態(tài)的每一次變更都會返回一個新的狀態(tài),這樣可以在變化時維護(hù)模型的整體性。響應(yīng)式表單是圍繞 ?Observable ?流構(gòu)建的,表單的輸入和值都是通過這些輸入值組成的流來提供的,它可以同步訪問。
響應(yīng)式表單還提供了一種更直觀的測試路徑,因為在請求時你可以確信這些數(shù)據(jù)是一致的、可預(yù)料的。這個流的任何一個消費(fèi)者都可以安全地操縱這些數(shù)據(jù)。
響應(yīng)式表單與模板驅(qū)動表單有著顯著的不同點。響應(yīng)式表單通過對數(shù)據(jù)模型的同步訪問提供了更多的可預(yù)測性,使用 Observable 的操作符提供了不可變性,并且通過 Observable 流提供了變化追蹤功能。
模板驅(qū)動表單允許你直接在模板中修改數(shù)據(jù),但不像響應(yīng)式表單那么明確,因為它們依賴嵌入到模板中的指令,并借助可變數(shù)據(jù)來異步跟蹤變化。
添加基礎(chǔ)表單控件
使用表單控件有三個步驟。
- 在你的應(yīng)用中注冊響應(yīng)式表單模塊。該模塊聲明了一些你要用在響應(yīng)式表單中的指令。
- 生成一個新的 ?
FormControl?實例,并把它保存在組件中。 - 在模板中注冊這個 ?
FormControl?。
然后,你可以把組件添加到模板中來顯示表單。
下面的例子展示了如何添加一個表單控件。在這個例子中,用戶在輸入字段中輸入自己的名字,捕獲其輸入值,并顯示表單控件的當(dāng)前值。
|
動作 |
詳情 |
|---|---|
注冊響應(yīng)式表單模塊 | 要使用響應(yīng)式表單控件,就要從
|
生成新的 | 使用 CLI 命令 可以用 ? |
在模板中注冊該控件 | 在組件類中創(chuàng)建了控件之后,你還要把它和模板中的一個表單控件關(guān)聯(lián)起來。修改模板,為表單控件添加 ?formControl ?綁定,?formControl ?是由 ?ReactiveFormsModule ?中的 ?FormControlDirective ?提供的。使用這種模板綁定語法,把該表單控件注冊給了模板中名為 ? |
顯示該組件 | 把該組件添加到模板時,將顯示指派給 ?
|
顯示表單控件的值
你可以用下列方式顯示它的值。
- 通過可觀察對象 ?
valueChanges?,你可以在模板中使用 ?AsyncPipe?或在組件類中使用 ?subscribe()? 方法來監(jiān)聽表單值的變化。 - 使用 ?
value?屬性。它能讓你獲得當(dāng)前值的一份快照。
下面的例子展示了如何在模板中使用插值顯示當(dāng)前值。
Value: {{ name.value }}
一旦你修改了表單控件所關(guān)聯(lián)的元素,這里顯示的值也跟著變化了。
響應(yīng)式表單還能通過每個實例的屬性和方法提供關(guān)于特定控件的更多信息。?AbstractControl ?的這些屬性和方法用于控制表單狀態(tài),并在處理表單校驗時決定何時顯示信息。
替換表單控件的值
響應(yīng)式表單還有一些方法可以用編程的方式修改控件的值,它讓你可以靈活的修改控件的值而不需要借助用戶交互。?FormControl ?提供了一個 ?setValue()? 方法,它會修改這個表單控件的值,并且驗證與控件結(jié)構(gòu)相對應(yīng)的值的結(jié)構(gòu)。比如,當(dāng)從后端 API 或服務(wù)接收到了表單數(shù)據(jù)時,可以通過 ?setValue()? 方法來把原來的值替換為新的值。
下列的例子往組件類中添加了一個方法,它使用 ?setValue()? 方法來修改 Nancy 控件的值。
updateName() {
this.name.setValue('Nancy');
}修改模板,添加一個按鈕,用于模擬改名操作。在點 ?Update Name? 按鈕之前表單控件元素中輸入的任何值都會回顯為它的當(dāng)前值。
由于表單模型是該控件的事實之源,因此當(dāng)你單擊該按鈕時,組件中該輸入框的值也變化了,覆蓋掉它的當(dāng)前值。
注意:
在這個例子中,你只使用單個控件,但是當(dāng)調(diào)用 ?
FormGroup?或 ?
FormArray?實例的 ?
setValue()? 方法時,傳入的值就必須匹配控件組或控件數(shù)組的結(jié)構(gòu)才行。
把表單控件分組
表單中通常會包含幾個相互關(guān)聯(lián)的控件。響應(yīng)式表單提供了兩種把多個相關(guān)控件分組到同一個輸入表單中的方法。
|
表單組 |
詳情 |
|---|---|
表單分組 | 定義了一個帶有一組控件的表單,你可以把它們放在一起管理。表單組的基礎(chǔ)知識將在本節(jié)中討論。你也可以通過嵌套表單組來創(chuàng)建更復(fù)雜的表單。 |
表單數(shù)組 | 定義了一個動態(tài)表單,你可以在運(yùn)行時添加和刪除控件。你也可以通過嵌套表單數(shù)組來創(chuàng)建更復(fù)雜的表單。 |
就像 ?FormControl ?的實例能讓你控制單個輸入框所對應(yīng)的控件一樣,?FormGroup ?的實例也能跟蹤一組 ?FormControl ?實例(比如一個表單)的表單狀態(tài)。當(dāng)創(chuàng)建 ?FormGroup ?時,其中的每個控件都會根據(jù)其名字進(jìn)行跟蹤。下面的例子展示了如何管理單個控件組中的多個 ?FormControl ?實例。
生成一個 ?ProfileEditor ?組件并從 ?@angular/forms? 包中導(dǎo)入 ?FormGroup ?和 ?FormControl ?類。
ng generate component ProfileEditor
import { FormGroup, FormControl } from '@angular/forms';要將表單組添加到此組件中,請執(zhí)行以下步驟。
- 創(chuàng)建一個 ?
FormGroup?實例。 - 把這個 ?
FormGroup?模型關(guān)聯(lián)到視圖。 - 保存表單數(shù)據(jù)。
|
動作 |
詳情 |
|---|---|
創(chuàng)建一個 | 在組件類中創(chuàng)建一個名叫 ? 對此個人檔案表單,要添加兩個 ? 這些獨立的表單控件被收集到了一個控件組中。這個 ? |
把這個 | 這個表單組還能跟蹤其中每個控件的狀態(tài)及其變化,所以如果其中的某個控件的狀態(tài)或值變化了,父控件也會發(fā)出一次新的狀態(tài)變更或值變更事件。該控件組的模型來自它的所有成員。在定義了這個模型之后,你必須更新模板,來把該模型反映到視圖中。
由 ? |
保存表單數(shù)據(jù) | ? ? ?
|
顯示此組件 | 要顯示包含此表單的 ? ?
|
創(chuàng)建嵌套的表單組
表單組可以同時接受單個表單控件實例和其它表單組實例作為其子控件。這可以讓復(fù)雜的表單模型更容易維護(hù),并在邏輯上把它們分組到一起。
如果要構(gòu)建復(fù)雜的表單,如果能在更小的分區(qū)中管理不同類別的信息就會更容易一些。使用嵌套的 ?FormGroup ?可以讓你把大型表單組織成一些稍小的、易管理的分組。
要制作更復(fù)雜的表單,請遵循如下步驟。
- 創(chuàng)建一個嵌套的表單組。
- 在模板中對這個嵌套表單分組。
某些類型的信息天然就屬于同一個組。比如名稱和地址就是這類嵌套組的典型例子,下面的例子中就用到了它們。
|
動作 |
詳情 |
|---|---|
創(chuàng)建一個嵌套的表單組。 | 要在 profileForm 中創(chuàng)建一個嵌套組,就要把一個嵌套的 address 元素添加到此表單組的實例中。 在這個例子中,? |
在模板中對這個嵌套表單分組。 | 在修改了組件類中的模型之后,還要修改模板,來把這個 FormGroup 實例對接到它的輸入元素。?
|
更新部分?jǐn)?shù)據(jù)模型
當(dāng)修改包含多個 ?FormGroup ?實例的值時,你可能只希望更新模型中的一部分,而不是完全替換掉。這一節(jié)會講解該如何更新 ?AbstractControl ?模型中的一部分。
有兩種更新模型值的方式:
|
方法 |
詳情 |
|---|---|
setValue() | 使用 |
patchValue() | 使用 |
?setValue()? 方法的嚴(yán)格檢查可以幫助你捕獲復(fù)雜表單嵌套中的錯誤,而 ?patchValue()? 在遇到那些錯誤時可能會默默的失敗。
在 ?ProfileEditorComponent ?中,使用 ?updateProfile ?方法傳入下列數(shù)據(jù)可以更新用戶的名字與街道住址。
updateProfile() {
this.profileForm.patchValue({
firstName: 'Nancy',
address: {
street: '123 Drew Street'
}
});
}通過往模板中添加一個按鈕來模擬一次更新操作,以修改用戶檔案。
當(dāng)點擊按鈕時,?profileForm ?模型中只有 ?firstName ?和 ?street ?被修改了。注意,?street ?是在 ?address ?屬性的對象中被修改的。這種結(jié)構(gòu)是必須的,因為 ?patchValue()? 方法要針對模型的結(jié)構(gòu)進(jìn)行更新。?patchValue()? 只會更新表單模型中所定義的那些屬性。
使用 FormBuilder 服務(wù)生成控件
當(dāng)需要與多個表單打交道時,手動創(chuàng)建多個表單控件實例會非常繁瑣。?FormBuilder ?服務(wù)提供了一些便捷方法來生成表單控件。?FormBuilder ?在幕后也使用同樣的方式來創(chuàng)建和返回這些實例,只是用起來更簡單。
通過下列步驟可以利用這項服務(wù)。
- 導(dǎo)入 ?
FormBuilder?類。 - 注入這個 ?
FormBuilder?服務(wù)。 - 生成表單內(nèi)容。
下面的例子展示了如何重構(gòu) ?ProfileEditor ?組件,用 ?FormBuilder ?來代替手工創(chuàng)建這些 ?FormControl ?和 ?FormGroup ?實例。
|
動作 |
詳情 |
|---|---|
導(dǎo)入 FormBuilder 類 | 從 ?@angular/forms? 包中導(dǎo)入 ?FormBuilder ?類。
|
注入 FormBuilder 服務(wù) | ?
|
生成表單控件 | ? 在上面的例子中,你可以使用 ?
比較一下用表單構(gòu)建器和手動創(chuàng)建實例這兩種方式。
|
驗證表單輸入
表單驗證用于確保用戶的輸入是完整和正確的。本節(jié)講解了如何把單個驗證器添加到表單控件中,以及如何顯示表單的整體狀態(tài)。
使用下列步驟添加表單驗證。
- 在表單組件中導(dǎo)入一個驗證器函數(shù)。
- 把這個驗證器添加到表單中的相應(yīng)字段。
- 添加邏輯來處理驗證狀態(tài)。
最常見的驗證是做一個必填字段。下面的例子給出了如何在 ?firstName ?控件中添加必填驗證并顯示驗證結(jié)果的方法。
|
操作 |
詳情 |
|---|---|
導(dǎo)入驗證器函數(shù) | 響應(yīng)式表單包含了一組開箱即用的常用驗證器函數(shù)。這些函數(shù)接收一個控件,用以驗證并根據(jù)驗證結(jié)果返回一個錯誤對象或空值。 從 ?
|
建一個必填字段 | 在 ?
|
顯示表單狀態(tài) | 當(dāng)你往表單控件上添加了一個必填字段時,它的初始值是無效的(invalid)。這種無效狀態(tài)會傳播到其父 ?FormGroup ?元素中,也讓這個 ?FormGroup ?的狀態(tài)變?yōu)闊o效的。你可以通過該 ?FormGroup ?實例的 ?status ?屬性來訪問其當(dāng)前狀態(tài)。提交按鈕被禁用了,因為 ? |
創(chuàng)建動態(tài)表單
?FormArray ?是 ?FormGroup ?之外的另一個選擇,用于管理任意數(shù)量的匿名控件。像 ?FormGroup ?實例一樣,你也可以往 ?FormArray ?中動態(tài)插入和移除控件,并且 ?FormArray ?實例的值和驗證狀態(tài)也是根據(jù)它的子控件計算得來的。不過,你不需要為每個控件定義一個名字作為 key,因此,如果你事先不知道子控件的數(shù)量,這就是一個很好的選擇。
要定義一個動態(tài)表單,請執(zhí)行以下步驟。
- 導(dǎo)入 ?
FormArray?類。 - 定義一個 ?
FormArray?控件。 - 使用 getter 方法訪問 ?
FormArray?控件。 - 在模板中顯示這個表單數(shù)組。
下面的例子展示了如何在 ?ProfileEditor ?中管理別名數(shù)組。
|
操作 |
詳情 |
|---|---|
導(dǎo)入 ??FormArray?? 類 | 從 ?
|
定義 FormArray 控件 | 你可以通過把一組(從零項到多項)控件定義在一個數(shù)組中來初始化一個 ? 使用 ?
|
訪問 FormArray 控件 | 相對于重復(fù)使用 ?profileForm.get()? 方法獲取每個實例的方式,getter 可以讓你輕松訪問表單數(shù)組各個實例中的別名。表單數(shù)組實例用一個數(shù)組來代表未定數(shù)量的控件。通過 getter 來訪問控件很方便,這種方法還能很容易地重復(fù)處理更多控件。 使用 getter 語法創(chuàng)建類屬性 ? aliases?,以從父表單組中接收表示綽號的表單數(shù)組控件。
定義一個方法來把一個綽號控件動態(tài)插入到綽號 ? 在這個模板中,這些控件會被迭代,把每個控件都顯示為一個獨立的輸入框。 |
在模板中顯示表單數(shù)組 | 要想為表單模型添加 ?aliases?,你必須把它加入到模板中供用戶輸入。和 ?FormGroupNameDirective ?提供的 ?formGroupName ?一樣,?FormArrayNameDirective ?也使用 ?formArrayName ?在這個 ?FormArray ?實例和模板之間建立綁定。 在 ? formGroupName ?? |
添加一個別名 | 最初,表單只包含一個綽號字段,點擊 ?
|
響應(yīng)式表單 API 匯總
下表給出了用于創(chuàng)建和管理響應(yīng)式表單控件的基礎(chǔ)類和服務(wù)。
類
|
類 |
詳情 |
|---|---|
AbstractControl | 所有三種表單控件類( |
FormControl | 管理單體表單控件的值和有效性狀態(tài)。它對應(yīng)于 HTML 的表單控件,比如 |
FormGroup | 管理一組 |
FormArray | 管理一些 |
FormBuilder | 一個可注入的服務(wù),提供一些用于提供創(chuàng)建控件實例的工廠方法。 |
指令
|
指令 |
詳情 |
|---|---|
FormControlDirective | 把一個獨立的 |
FormControlName | 把一個現(xiàn)有 |
FormGroupDirective | 把一個現(xiàn)有的 |
FormGroupName | 把一個內(nèi)嵌的 |
FormArrayName | 把一個內(nèi)嵌的 |
本文題目:創(chuàng)新互聯(lián)Angular教程:Angular響應(yīng)式表單
URL地址:http://www.dlmjj.cn/article/djcjdis.html


咨詢
建站咨詢
