3.响应式表单

如何创建一个数据模型,有定义在ngForms模块中三个类组成,FormControl,FormGroup,FormArray。
一.FromControl:构成表单的基本单位,代表input元素,可以代表日历,下拉选择框,保存着元素当前的值,校验状态,是否修改过
演示:如何创建FromControl?

表单.ts

 userName: FormControl = new FormControl('AAA'); /* 接收一个参数,代表输入框的初始值,naModel会为附着的元素input创建FormContrl*/

二、FormGroup:可以代表表单一部分,也可以用与代表整个表单,是多个Formcontrol的集合。
一个Formcontrol是无效的,那个FormGroup也是无效的。日期范围字段。
演示;如何创建FormGroup?

formModel: FormGroup = new FormGroup({  // 创建的formGroup
    form: new FormControl(), // 日期范围
    to: new FormControl()
  })

三、FormArray:FormGroup类似,有一个长度属性。代表可以增长的字段集合。,有email,多个邮箱,可以用这个输入任意一个。

emails: FormArray = new FormArray([  /*与FormGroup的formContrl不同的是,没有key,托序号来访问,第一个序号就是0,,*/
  new FormControl('aa@df.com'),
  new FormControl('BB@DD.COM')
])

介绍下指令
响应式表单指令与模板指令完全不同,来自于
ReactiveFormComponent


image.png

注意:1.指令是form开头,ng开头的是模板式表单;2.响应式form指令不可引用 #myForm="myform" .操作数据模型只能在代码中操作,模板指令是在代码中操作。
模板表单变响应式,通常用formGroup代表整个表单。

一.表单.html(formGroup代表整个表单)

<form [formGroup]="forModel" (submit)="onSubmit()"> <!--表单处理方式变成了响应式-->
<div>
  起始日期<input type="date">
  截止日期<input type="date">
</div>
<div>
  <ul>
    <li>
      <input type="text">
    </li>
  </ul>
  <button type="button">增加Email</button>
</div>
<div>
  <button type="submit">保存</button>
</div>
</form>

表单.ts

forModel: FormGroup = new FormGroup({})/*表示整个表单的数据*/
onSubmit() {
    console.log(this.forModel.value);
 }

二.formGroupName链接一个group:加数据

forModel: FormGroup = new FormGroup({  // 创建的formGroup
   dateRange: new FormGroup({
      form: new FormControl(), // 日期范围
       to: new FormControl()
   })
 }) ;
 <div formGroupName="dateRange">
    起始日期<input type="date" formControlName="from">
    截止日期<input type="date" formControlName="to">
  </div>

效果:能把日期控件的值保存。([formGroup]="forModel"是后台的属性,formGroupName的值是一个字符串)

三、formControlName的值也是一个字符串,用在formGroupName指令内
四、formAarryName
必须用在<form 的formGroup之内。
步骤1:将模板的ul和控制器的emails的formAarry里的formControl绑定了

formModel: FormGroup = new FormGroup({  // 创建的formGroup
    dateRange: new FormGroup({
       form: new FormControl(), // 日期范围
        to: new FormControl()
    }),
    emails: new FormArray([/*只有顺序号,和ngFor一起使用*/
      new FormControl('aa.com'),
      new FormControl('bb.com')
    ])
  }) ;
<ul formArrayName="emails"> <!--和ts绑定--><!--this.formModel.get('emails').controls  控制器i的emai集合-->
      <li *ngFor="let e of  this.formModel.get('emails').controls; let i=index;"><!--需要当前循环下标-->
        <input type="text" [formControlName]="i"><!--和循环下标绑定子一起-->
      </li>
    </ul>

步骤2:点击按钮向eamils数组添加元素,添加输入框

addEmail() {
    const emails = this.formModel.get('emails') as FormArray;
    /*添加一个邮箱输入框,需要拿到FormAarry,*/
    emails.push(new FormControl()); /*模板根据数组循环,数组多一个元素,多一个输入框*/
 }
<div>
    <ul formArrayName="emails"> <!--和ts绑定--><!--this.formModel.get('emails').controls  控制器i的emai集合-->
      <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>

    <button type="submit">保存</button>
  </div>

效果:就增加了邮箱输入框,保存成功

五formControl
只能用在form外部


image.png

image.png

image.png
export class ReactiveFormComponent implements OnInit {

  formModel: FormGroup = new FormGroup({  // 创建的formGroup
    userName: new FormControl('aaa'),
    dateRange: new FormGroup({
       form: new FormControl(), // 日期范围
        to: new FormControl()
    }),
    emails: new FormArray([/*只有顺序号,和ngFor一起使用*/
      new FormControl('aa.com'),
      new FormControl('bb.com')
    ])
  }) ;

  /*emails: FormArray = new FormArray([  /!*与FormGroup的formContrl不同的是,没有key,托序号来访问,第一个序号就是0,,*!/
    new FormControl('aa@df.com'),
    new FormControl('BB@DD.COM')
  ]);*/


  constructor() { }
 onSubmit() {
    console.log(this.formModel.value);
 }
 addEmail() {
    const emails = this.formModel.get('emails') as FormArray;
    /*添加一个邮箱输入框,需要拿到FormAarry,*/
    emails.push(new FormControl()); /*模板根据数组循环,数组多一个元素,多一个输入框*/
 }
  ngOnInit() {
  }

}

<form [formGroup]="formModel" (submit)="onSubmit()"> <!--表单处理方式变成了响应式-->
 
 <input formControlName="userName">

  <div formGroupName="dateRange">
    起始日期<input type="date" formControlName="from">
    截止日期<input type="date" formControlName="to">
  </div>
  <div>
    <ul formArrayName="emails"> <!--和ts绑定--><!--this.formModel.get('emails').controls  控制器i的emai集合-->
      <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>

    <button type="submit">保存</button>
  </div>
</form>

image.png

image.png

注意:所有指令都是以form开头的。以name结尾,不需要使用【】,只需要指定名字;只能用在【formGroup】指令之内。
不以name结尾则用【】。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 1.简单的H5表单 当我们点击注册按钮的时候会对表单进行校验 2.Angular表单的分类 两种表单的不同点 3....
    神豪VS勇士赢阅读 743评论 0 1
  • 一.课程简介 (注意:这里的AngularJS指的是2.0以下的版本) AngularJS的优点: 模板功能强大丰...
    壹点微尘阅读 859评论 0 0
  • HTML表单 在HTML中,表单是 ... 之间元素的集合,它们允许访问者输入文本、选择选项、操作对象等等,然后将...
    兰山小亭阅读 3,364评论 2 14
  • nimboldi阅读 348评论 0 1
  • 看完剽悍晨读的文章之后,脑海里想到的词是“及时止损”这词。我对股票一窍不通,但对这词的印象特别深,就感觉这词很贴切...
    豪小阅读 284评论 0 0