美文网首页
3.响应式表单

3.响应式表单

作者: Monee121 | 来源:发表于2018-03-03 23:00 被阅读0次

如何创建一个数据模型,有定义在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结尾则用【】。

相关文章

  • 3.响应式表单

    如何创建一个数据模型,有定义在ngForms模块中三个类组成,FormControl,FormGroup,Form...

  • 细说 Angular 2+ 的表单(二):响应式表单

    细说 Angular 2+ 的表单(一):模板驱动型表单 响应式表单 响应式表单乍一看还是很像模板驱动型表单的,但...

  • Angular 表单1--响应式表单

    Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。本节先讲响应式表单。最终实例...

  • 14.《Angular响应式表单》

    一、使用响应式表单 Angular 的响应式表单能让实现响应式编程风格更容易,这种编程风格更倾向于在非 UI 的数...

  • angular表单的使用实例

    大纲 1、模板驱动表单的创建2、响应式表单的创建3、模板驱动型表单的自定义指令4、响应式表单的自定义指令5、父组件...

  • Angular表单验证

    angular4里一个响应式编程的小例子 Angular2 响应式表单验证 Angular开发(十一)-关于响应式...

  • 2018-08-16 angular--disabled

    响应式表单 - disabled表现 当表单控件设置了disabled属性 * Disabled co...

  • angular表单知识点

    大纲 1、对表单的理解2、模板驱动表单(Template Driven Forms)3、响应式表单(Reactiv...

  • Angular表单处理

    第七章 表单处理 学习内容: 一.简述模板式表单与响应式表单的不同 Angular表单API 模板式表单简述: ...

  • angular 表单

    官网总结 链接地址:angular 表单github例子:github例子 1. 响应式表单和模板驱动表单 1.1...

网友评论

      本文标题:3.响应式表单

      本文链接:https://www.haomeiwen.com/subject/gjqxfftx.html