Angular 響應(yīng)式表單

文章轉(zhuǎn)自我的語雀:https://www.yuque.com/liuyin-zzwa0/angular/reactive-forms

響應(yīng)式表單使用顯式的驮肉、不可變的方式熏矿,管理表單在特定的時(shí)間點(diǎn)上的狀態(tài)。對表單狀態(tài)的每一次變更都會返回一個(gè)新的狀態(tài)离钝,這樣可以在變化時(shí)維護(hù)模型的整體性票编。響應(yīng)式表單是圍繞 Observable 的流構(gòu)建的,表單的輸入和值都是通過這些輸入值組成的流來提供的卵渴,它可以同步訪問慧域。
響應(yīng)式表單還提供了一種更直觀的測試路徑,因?yàn)樵谡埱髸r(shí)你可以確信這些數(shù)據(jù)是一致的浪读、可預(yù)料的昔榴。這個(gè)流的任何一個(gè)消費(fèi)者都可以安全地操縱這些數(shù)據(jù)。
響應(yīng)式表單與模板驅(qū)動的表單有著顯著的不同點(diǎn)碘橘。響應(yīng)式表單通過對數(shù)據(jù)模型的同步訪問提供了更多的可預(yù)測性互订,使用 Observable 的操作符提供了不可變性,并且通過 Observable 流提供了變化追蹤功能蛹屿。

合理使用Angular響應(yīng)式表單屁奏,將使我們更能簡單的實(shí)現(xiàn)一個(gè)復(fù)雜的表單

表單的兩種創(chuàng)建方式

手動創(chuàng)建實(shí)例

直接使用FormGroupFormControl創(chuàng)建

this.profileForm = new FormGroup({
  firstName: new FormControl(''),
  lastName: new FormControl(''),
  address: new FormGroup({
    street: new FormControl(''),
    city: new FormControl(''),
    state: new FormControl(''),
    zip: new FormControl('')
  })
});

使用表單構(gòu)建器

使用FormBuilder服務(wù)創(chuàng)建

this.profileForm = this.fb.group({
  firstName: [''],
  lastName: [''],
  address: this.fb.group({
    street: [''],
    city: [''],
    state: [''],
    zip: ['']
  }),
});

Tips:當(dāng)然,兩種方式混合使用也是沒問題的

優(yōu)雅的使用響應(yīng)式表單

合理使用 formState 错负、 disable 坟瓢、 enable 勇边、 registerControl 實(shí)現(xiàn)控件的禁用/編輯狀態(tài)

雖然在Angular的類型定義中 formStateany 類型,但在實(shí)際的使用中折联,它的類型如下:

interface FormState { value: any; disabled: boolean; }

在構(gòu)建表單時(shí)粒褒,若是有需要某個(gè)字段disabled,下面的方式就可以幫你實(shí)現(xiàn):

this.profileForm = this.fb.group({
  firstName: [{value: null, disabled: true}],
});
// 或者诚镰,兩種方式都是一樣的效果
this.profileForm = new FormGroup({
  firstName: new FormControl({value: null, disabled: true}),
});

在表單使用中奕坟,動態(tài)enable/disable,這時(shí)候就需要借助FormGroup清笨、FormControl實(shí)現(xiàn)了:

this.profileForm.disable();
this.profileForm.enable();
this.profileForm.get('firstName').disable();
this.profileForm.get('firstName').reset({value: 'Outh', disabled: false});
this.profileForm.reset({
    firstName: {value: null, disabled: true},
  lastName: {value: 'Jim', disabled: false},
  address: {
    street: null,
    city: null,
    state: null,
    zip: null
  },
});

使用 addControl 月杉、 removeControlFormArray 動態(tài)刪減表單控件

使用方式如下:

this.profileForm.addControl('aliases', this.fb.array([
    this.fb.control('')
]));

this.profileForm.removeControl('lastName');

const aliasesArray = (this.profileForm.get('aliases') as FormArray);
aliasesArray.push(this.fb.control(''));
aliasesArray.removeAt(1);
aliasesArray.reset();

template配合響應(yīng)式表單

控件有禁用/編輯狀態(tài)

<div *ngIf="profileForm.get('firstName')?.enabled">
  <input formControlName="firstName" />
</div>

動態(tài)的表單控件

<div *ngIf="profileForm.get('firstName')">
  <input formControlName="firstName" />
</div>

Tips:若是控件名稱位置抠艾,可以使用 Object.keys 方法實(shí)現(xiàn)

表單數(shù)組展示

<form nz-form [formGroup]="profileForm" nzLayout="horizontal">
    <div formArrayName="aliases">
        <ng-container *ngFor="let g of profileForm.get('aliases')?.controls; let i= index" [formGroupName]="i">
            <nz-form-item>
                <nz-form-label nzFor="name" nzSpan="6" nzRequired>name</nz-form-label>
                <nz-form-control nzSpan="18">
                    <input nz-input formControlName="name" id="name" name="name" placeholder="">
                </nz-form-control>
                </nz-form-item>
            <nz-form-item>
                <nz-form-label nzFor="image" nzSpan="6" nzRequired>image</nz-form-label>
                <nz-form-control nzSpan="18">
                    <input nz-input formControlName="image" id="image" name="image" placeholder="">
                </nz-form-control>
            </nz-form-item>
        </ng-container>
    </div>
</form>

基于業(yè)務(wù)對象模型的元數(shù)據(jù)苛萎,動態(tài)創(chuàng)建表單

關(guān)于動態(tài)表單,官方文檔以詳細(xì)列出使用方式了检号,具體請看https://angular.cn/guide/dynamic-form


更多詳細(xì)用法請?jiān)L問響應(yīng)式表單腌歉,推薦使用Angular CLI搭建本地開發(fā)環(huán)境,自行體驗(yàn)O_o

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齐苛,一起剝皮案震驚了整個(gè)濱河市翘盖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凹蜂,老刑警劉巖馍驯,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炊甲,居然都是意外死亡泥彤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門卿啡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吟吝,“玉大人,你說我怎么就攤上這事颈娜〗L樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵官辽,是天一觀的道長蛹磺。 經(jīng)常有香客問我,道長同仆,這世上最難降的妖魔是什么萤捆? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上俗或,老公的妹妹穿的比我還像新娘市怎。我一直安慰自己,他們只是感情好辛慰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布区匠。 她就那樣靜靜地躺著,像睡著了一般帅腌。 火紅的嫁衣襯著肌膚如雪驰弄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天速客,我揣著相機(jī)與錄音戚篙,去河邊找鬼。 笑死溺职,一個(gè)胖子當(dāng)著我的面吹牛已球,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辅愿,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忆某!你這毒婦竟也來了点待?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤弃舒,失蹤者是張志新(化名)和其女友劉穎癞埠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聋呢,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苗踪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了削锰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通铲。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖器贩,靈堂內(nèi)的尸體忽然破棺而出颅夺,到底是詐尸還是另有隱情,我是刑警寧澤蛹稍,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布吧黄,位于F島的核電站,受9級特大地震影響唆姐,放射性物質(zhì)發(fā)生泄漏拗慨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赵抢。 院中可真熱鬧剧蹂,春花似錦、人聲如沸昌讲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽短绸。三九已至车吹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醋闭,已是汗流浹背窄驹。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留证逻,地道東北人乐埠。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像囚企,于是被迫代替她去往敵國和親丈咐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容