Angular data12

表單處理

  • 模板式表單
  • 響應式表單
  • 表單校驗

模板式表單需要在app.module.ts中引入FormsModule;
響應式表單中需要在app.module.ts中引入ReactiveFormsModule;

image.png

模板式表單

  • NgForm
  • NgModel
  • NgModelGroup

在form 標簽中加 ngNoForm可以取消angular對表單的接管

代碼樣例:

//模板中

<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm.value)">
  <div>用戶名:<input ngModel name="username" type="text"></div>
  <div>手機號:<input ngModel name="mobile" type="number"></div>

  <div ngModelGroup="passwordsGroup">
    <div>密碼:<input ngModel name="password" type="password"></div>
    <div>確認密碼:<input  ngModel name="pconfirm" type="password"></div>
  </div>

  <button type="submit">注冊</button>
</form>

<div>
  {{myForm.value | json}}
</div>

<br>
<div>
  {{username.value}}
</div>

//組件中

onSubmit(item:any){
    console.log(item);
  }

響應式表單

  • FormControl - 它是一個為單個表單控件提供支持的類痹届,可用于跟蹤控件的值和驗證狀態(tài)淡溯,此外還提供了一系列公共API脚仔。

使用示例:

ngOnInit() {
  this.myControl = new FormControl('Semlinker');
}
  • FormGroup - 包含是一組 FormControl 實例琳水,可用于跟蹤 FormControl 組的值和驗證狀態(tài),此外也提供了一系列公共API疾层。

使用示例:

ngOnInit() {
  this.myGroup = new FormGroup({
    name: new FormControl('Semlinker'),
    location: new FormControl('China, CN')
  });
}
  • FormArray - 包含是一組 FormControl 數(shù)組集合蝌戒。

定義示例:

...
//FormControl
username:FormControl = new FormControl('aaa');

//FormControl
  formModel:FormGroup = new FormGroup({
    from:new FormControl(),
    to:new FormControl(),
  });

//FormArray
  emails:FormArray = new FormArray([
    new FormControl("a@a.com"),
    new FormControl("b@b.com"),
  ]);
...

用到的相關綁定指令

圖中第二列指令是屬性綁定
第三列指令是使用屬性的模形來連接數(shù)據(jù)模型和DOM元素的

  • 模板式表單是只能在模板中通過本地變量賦值來操作DOM
  • 響應式表單是只能在代碼中通過FormCtrol贸街、FormGroup、FormArray對象來操作DOM
  • name結(jié)尾的指令使用的時候不需要屬性綁定的方括號茅姜,直接使用闪朱,值為屬性的名字(類似字符串的賦值);
  • 另外使用name結(jié)尾的指令只能使用在formGroup指令的覆蓋范圍之內(nèi)钻洒;
  • formGroup和formControl指令不能互相嵌套奋姿;

實例1:

ng g component reactiveForm

在reactive-form.component.ts中

import { Component, OnInit } from '@angular/core';
import {FormArray, FormControl, FormGroup} from "@angular/forms";

@Component({
 selector: 'app-reactive-form',
 templateUrl: './reactive-form.component.html',
 styleUrls: ['./reactive-form.component.css']
})
export class ReactiveFormComponent implements OnInit {

 formModel:FormGroup = new FormGroup({
   username:new FormControl(),
   dateRange:new FormGroup({
     from:new FormControl(),
     to:new FormControl(),
   }),
   emails: new FormArray([
     new FormControl("a@a.com"),
     new FormControl("b@b.com"),
   ]),
 });

 constructor() { }
 ngOnInit() {
 }

 onSubmit(){
   console.log(this.formModel.value)
 }
 addEmail(){
   let email = this.formModel.get('emails') as FormArray;
   email.push(new FormControl());
 }
}

在reactive-form.component.html中

<form [formGroup]="formModel" (submit)="onSubmit()">
  <input type="text" formControlName="username">
  <div formGroupName="dateRange">
    起始日期:<input type="date" formControlName="from">
    截止日期:<input type="date" formControlName="to">
  </div>
  <div>
    <ul formArrayName="emails">
      <li *ngFor="let e of this.formModel.get('emails').controls;let i=index;">
        <input type="text" [formControlName]="i">
      </li>
    </ul>
    <button type="button" (click)="addEmail()">增加Email</button>
  </div>
  <div>
    <button type="submit">保存</button>
  </div>
</form>

實例2:

ng g component reactiveRegist

實現(xiàn)代碼:

在reactive-regist.component.html模板中

<form [formGroup]="formModel" (submit)="onSubmit()">
  <div>用戶名:<input type="text" formControlName="username"></div>
 <div>手機號:<input type="text" formControlName="mobile"></div>

  <div formGroupName="passwordsGroup">
    <div>密碼:<input type="password" formControlName="password"></div>
    <div>重復密碼:<input type="password" formControlName="pconfirm" ></div>
  </div>
  <button type="submit">提交</button>
</form>

在reactive-regist.component.ts?組件控制器中

import { Component, OnInit } from '@angular/core';
import {FormControl, FormGroup} from "@angular/forms";

@Component({
  selector: 'app-react-regist',
  templateUrl: './react-regist.component.html',
  styleUrls: ['./react-regist.component.css']
})
export class ReactRegistComponent implements OnInit {
  formModel:FormGroup;
  constructor() {
    this.formModel = new FormGroup({
      username:new FormControl(),
      mobile:new FormControl(),
      passwordsGroup:new FormGroup({
        password:new FormControl(),
        pconfirm:new FormControl(),
      })
    });
  }
  onSubmit(){
    console.log(this.formModel.value);
  }
  ngOnInit() {
  }
}

FormBuilder用法

FormBuilder通過依賴注入可以精減代碼量,同時可以傳入?yún)?shù)實現(xiàn)檢驗素标;現(xiàn)在把上例的表單模型做重構(gòu)称诗;

...
export class ReactRegistComponent implements OnInit {
  formModel:FormGroup;
  constructor(fb:FormBuilder) {
    this.formModel = fb.group({
      username:[''],
      mobile:[''],
      passwordsGroup:fb.group({
        password:[''],
        pconfirm:[''],
      })
    });
  }
  onSubmit(){
    console.log(this.formModel.value);
  }
  ngOnInit() {
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市头遭,隨后出現(xiàn)的幾起案子寓免,更是在濱河造成了極大的恐慌,老刑警劉巖计维,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袜香,死亡現(xiàn)場離奇詭異,居然都是意外死亡享潜,警方通過查閱死者的電腦和手機困鸥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疾就,你說我怎么就攤上這事澜术。” “怎么了猬腰?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵鸟废,是天一觀的道長。 經(jīng)常有香客問我姑荷,道長盒延,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任鼠冕,我火速辦了婚禮添寺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懈费。我一直安慰自己计露,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布憎乙。 她就那樣靜靜地躺著票罐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泞边。 梳的紋絲不亂的頭發(fā)上该押,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音阵谚,去河邊找鬼蚕礼。 笑死,一個胖子當著我的面吹牛椭蹄,可吹牛的內(nèi)容都是我干的闻牡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼绳矩,長吁一口氣:“原來是場噩夢啊……” “哼罩润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翼馆,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤割以,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后应媚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體严沥,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年中姜,在試婚紗的時候發(fā)現(xiàn)自己被綠了消玄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跟伏。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翩瓜,靈堂內(nèi)的尸體忽然破棺而出受扳,到底是詐尸還是另有隱情,我是刑警寧澤兔跌,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布勘高,位于F島的核電站,受9級特大地震影響坟桅,放射性物質(zhì)發(fā)生泄漏华望。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一仅乓、第九天 我趴在偏房一處隱蔽的房頂上張望赖舟。 院中可真熱鬧,春花似錦夸楣、人聲如沸建蹄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痛单,卻和暖如春嘿棘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旭绒。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工鸟妙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挥吵。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓重父,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忽匈。 傳聞我的和親對象是個殘疾皇子房午,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)丹允,斷路器郭厌,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 本文將介紹如何動態(tài)創(chuàng)建表單組件,我們最終實現(xiàn)的效果如下: 在閱讀本文之前雕蔽,請確保你已經(jīng)掌握 Angular 響應式...
    semlinker閱讀 3,869評論 0 7
  • 預 (ahead-of-time, AoT) 編譯 在打包項目的時候提前編譯好應用折柠,打包好之后可以直接啟動,而不是...
    莫莫莫I閱讀 614評論 0 8
  • Angular 4.x 中有兩種表單: Template-Driven Forms - 模板驅(qū)動式表單 (類似于...
    semlinker閱讀 1,272評論 0 2
  • 前前后后這本書在我的枕邊已有一個月批狐,每周我會拿出半天時間來閱讀它扇售,最后給我印象比較深的體會是:產(chǎn)品要找對核心用戶,...
    Sev7閱讀 1,196評論 0 2