angular4 Form表单相关

205 篇文章 0 订阅
175 篇文章 1 订阅

原文出处:https://www.cnblogs.com/artimis/p/9019518.html  (原文更易阅读)

ng4中,有两种方式去声明一个表单

  • 一:Template-Driven Forms - 模板驱动式表单   [引入FormsModule]

1.ngForm赋值 [可以方便的获取表单的]

<form #f='ngForm' novalidate (ngSumbit)='onSubmit(f)'>
  <input type='text'
         name='username'
         [(ngModel)]='login.username'
         required>
  <div *ngIf='f.controls.username?.required' class='error'>
    Name is required. 
 </div> 
</form>  
   

 

2.ngModel绑定 [ngModel会自动关联表单控件name属性,并使用该值作为ngForm对象的属性名]

   以下有三种写法:

<input type='text' name='username' ngModel>
<input type='text' name='username' [ngModel]='login.username'>
<input type='text' name='username' [(ngModel)]='login.username'>

3.ngModel赋值 [可以操纵表单控件的事件]

<form #f='ngForm' novalidate (ngSumbit)='onSubmit(f)'>
  <input type='text'
          name='username'
          [(ngModel)]='login.username'
          #username='ngModel'
          (change)='changeName(username.value)'
          required>
  <div *ngIf='username.error?.required && username.touched' class='error'>
    Name is required. 
 </div> 
</form> 

 

4.验证规则相关 [required/minlength/maxlength等]

<form #f='ngForm' novalidate (ngSumbit)='onSubmit(f)'>
  <input  type='text'
       name='username'
       [(ngModel)]='login.username' 
          #username='ngModel'
           minlength='8'>
  <div *ngIf='username.error?.minlength && username.touched' class='error'>
    The minlength is 8.
 </div> 
</form> 

 

5.验证状态相关 [touched/valid/invalid/pristine/dirty/untouched等]

   valid:控件有效

   invalid:控件无效

   pristine:控件值未改变

   dirty:控件值已改变

   untouched:表单控件未被访问过

<form novalidate #f='ngForm'>
    ...
   <button type='submit' 
           [disabled]='f.invalid' 
           (click)='onSubmit(f)'>
           submit
  </button>
</form>        

 

 

  • 二:Reactive Forms (Model-Driven Forms) - 响应式表单  [引入ReactiveFormsModule]

1.FormGroup(FormControl+FormArray)[表单对象]

   FormGroup包含一组FormControl和FormArray的实例,可用于跟踪一组实例的值和验证状态

   FormControl & FormArray:为单个表单控件提供支持的类,用于跟踪控件的值和验证状态 前者是单值类型,后者是多值类型

<form novalidate [formGroup]='thatForm'>
    <input type='text' formControlName='name'>
</form>

2.Validators [表单验证]

//html方面

<form novalidate [formGroup]='thatForm'>
    <input type='text' formControlName='name'>
    <div class='error' 
           *ngIf="thatForm.get('name').hasError('required') && 
                  thatForm.get('name').touched">
            Name is required
    </div>
    <div class='error' 
           *ngIf="thatForm.get('name').hasError('minlength') && 
                  thatForm.get('name').touched">
            The minlength is 2.
    </div>
</form>

 

//xx.component.ts

export class xxComponent implements OnInit{
    thatForm: FormGroup;
    constructor(){};
   ngOnInit() {
    this.thatForm=new FormGroup({
       name:new FormGroup('',[Validators.required,Validators.minLength(2)])     
   })      
  }
}     

 

3.FormBuilder [简化新建FormGroup对象整个过程]

//FormGroup用法

export class xxComponent implements OnInit{
    thatForm: FormGroup;
    constructor(){};
   ngOnInit() {
    this.thatForm=new FormGroup({
       name:new FormGroup('',[Validators.required,Validators.minLength(2)])     
   })      
  }
}   

 

//FormBuilder用法

export class xxComponent implements OnInit{
    thatForm: FormGroup;
    constructor(private formBuilder: FormBuilder){};
   ngOnInit() {
      this.thatForm=this.formBuilder.group({
          name:['',[Validator.required,Validators.minLength(2)]]
     })
   }
} 

 

4.FormValidation [统一管理验证错误]

//html方面
<form novalidate [formGroup]='thatForm'>
    <input type='text' formControlName='name'>
    <div class='error'>
      {{formValidation.msgs.name.errors}}
    </div>
</form>

 

//form-validation.ts

export class xxValidation extends FormValidation{
   constructor(){
     super()
  }
  msgs={
    name:{
      errors:'',
      messages:{ 
         required:'please type the name.',
         minlength:'please enter 3 charactors atleast.'
     }
   }
 }
}

 

//xx.component.ts

export class xxComponent implements OnInit{
    formValidation:xxValidation=new xxValidation();
     thatForm:FormGroup;

    constructor(private formBuilder: FormBuilder){}
     ngOnInit(){
      this.thatForm=this.formBuilder.group({
       name:['',[Validators.required,Validators.minLength(4)]] 
     })
   }
   
}

 

  • 两种方式的比较:

模板驱动表单(Template-Driven Forms

1.使用方便

2.适用于简单的场景

3.通过[(ngModel)]实现数据双向绑定

4.最小化组件类的代码

5.不利于单元测试

响应式表单(Reactive Forms

1.比较灵活

2.适用于复杂的场景

3.简化了HTML模板的代码,把验证逻辑抽离出来了

4.方便跟踪表单控件值的变化

5.易于单元测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular中,可以使用FormGroup和FormControl来管理表单数据,也可以通过使用本地存储(localStorage)来缓存表单数据。 以下是一个简单的例子,可以将表单数据存储在本地存储中: 1. 在表单组件中,定义一个FormGroup对象,并将其初始化为存储在本地存储中的值(如果存在): ``` import { Component } from '@angular/core'; import { FormGroup, FormControl } from '@angular/forms'; @Component({ selector: 'app-form', templateUrl: './form.component.html', styleUrls: ['./form.component.css'] }) export class FormComponent { form: FormGroup; constructor() { this.form = new FormGroup({ name: new FormControl(localStorage.getItem('name')), email: new FormControl(localStorage.getItem('email')), phone: new FormControl(localStorage.getItem('phone')) }); } onSubmit() { // Save form data to local storage localStorage.setItem('name', this.form.value.name); localStorage.setItem('email', this.form.value.email); localStorage.setItem('phone', this.form.value.phone); // Submit form data to server // ... } } ``` 2. 在表单提交时,将表单数据存储在本地存储中: ``` onSubmit() { // Save form data to local storage localStorage.setItem('name', this.form.value.name); localStorage.setItem('email', this.form.value.email); localStorage.setItem('phone', this.form.value.phone); // Submit form data to server // ... } ``` 3. 在表单组件中添加一个ngOnDestroy钩子函数,以确保在组件销毁时清除本地存储中的表单数据: ``` import { Component, OnDestroy } from '@angular/core'; import { FormGroup, FormControl } from '@angular/forms'; @Component({ selector: 'app-form', templateUrl: './form.component.html', styleUrls: ['./form.component.css'] }) export class FormComponent implements OnDestroy { form: FormGroup; constructor() { this.form = new FormGroup({ name: new FormControl(localStorage.getItem('name')), email: new FormControl(localStorage.getItem('email')), phone: new FormControl(localStorage.getItem('phone')) }); } onSubmit() { // Save form data to local storage localStorage.setItem('name', this.form.value.name); localStorage.setItem('email', this.form.value.email); localStorage.setItem('phone', this.form.value.phone); // Submit form data to server // ... } ngOnDestroy() { // Clear form data from local storage localStorage.removeItem('name'); localStorage.removeItem('email'); localStorage.removeItem('phone'); } } ``` 这样,当用户重新访问该页面时,表单数据将从本地存储中自动填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值