Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx

上传人:b****5 文档编号:28506133 上传时间:2023-07-18 格式:DOCX 页数:15 大小:166.65KB
下载 相关 举报
Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx_第1页
第1页 / 共15页
Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx_第2页
第2页 / 共15页
Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx_第3页
第3页 / 共15页
Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx_第4页
第4页 / 共15页
Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx

《Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx》由会员分享,可在线阅读,更多相关《Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx(15页珍藏版)》请在冰豆网上搜索。

Angular 27 初步了解表单模板驱动及数据驱动及脱坑要点.docx

Angular27初步了解表单模板驱动及数据驱动及脱坑要点

Angular2+折腾记:

(7)初步了解表单:

模板驱动及数据驱动及脱坑要点

前言

表单在整个系统中的作用相当重要,这里主要扯下响应表单的实现方式。

首先需要操作表单的模块引入这两个模块;

import{FormsModule,ReactiveFormsModule}from'@angular/forms';

模板驱动表单依赖FormsModule,数据驱动的表单依赖FormsModule,ReactiveFormsModule

一般做表单校验及操作推荐用数据驱动的方式,好维护和理解。

模板驱动

模板驱动:

主要是依赖[(ngModel)]和#scope_var以及原生表单控件属性(require,minlenght,maxlength等)来操作表单的那的值亦或者校验

一个最简单的例子

--#UserName是局部变量,若是有ngmodel,拿到的就是一个响应对象,若是非ngmodel绑定的,则是dom元素代码-->

--testform这个局部变量保存了表单的所有相关信息-->

--ngSubmit是用来触发表单提交的-->

--ngModel相应变量的值-->

--$event是原生dom对象-->

Name

requiredminlength="4"maxlength="24"

name="username"[(ngModel)]="username"[ngModelChange]="validate($event)">

testform.submitted)">

您输入的值有误,请重新输入

提交

有两种方式处理来对上面的表单做校验;

在Submit()函数内,在点击提交的时候对整个表单一一去判断,传统方式基本这样

每个控件输入的时候对应去触发对应的事件做校验,比如[ngModelChange]来处理双向绑定的值校验

数据驱动(ReactiveForm)

响应式表表单:

原理是一开始就构建整个表单,表单的值通过特殊指令formControlName一一关联(类似ngModel);

相关名词:

-FormGroup:

用来追踪表单控件有效状态及值=》可以理解为获取且可以操作整个表单的数据

-FormBuilder:

表单数据构建工具[构建初始表单],简化构建代码(包括了newFormGroup(),newFormControl(),newFormArray()),FormGroup()内置多种校验方式

-formControlName:

同步与FormGroup构建表单内相同字段的值!

项目中的案例

html

showLoading">

欢迎登录

form.controls.UserName.invalid&&form.controls.UserName.value,'has-success':

form.controls.UserName.valid&&form.controls.UserName.value}">

账号不符合规范

账号符合规范

form.controls.PassWord.invalid&&form.controls.PassWord.value,'has-success':

form.controls.PassWord.valid&&form.controls.PassWord.value}">

密码不符合规范,请重新输入

密码符合规范

记住账号

--忘记密码-->

{{messageTips}}

登录

没有账号?

点击用户登记

component.ts

import{Component,OnInit,OnDestroy}from'@angular/core';

import{FormGroup,Validators,FormBuilder}from'@angular/forms';//引入表单的一些特性

import{Router}from'@angular/router';

import{AccountService}from'../../services/account.service';

import{environment}from'../../../../../environments/environment';

import{flyIn}from'../../../../animation/flyIn';

import{Observable}from'rxjs/Observable';

@Component({

selector:

'app-login',

templateUrl:

'./ponent.html',

styleUrls:

['./ponent.scss'],

animations:

[flyIn]

})

exportclassLoginComponentimplementsOnInit,OnDestroy{

publicform:

FormGroup;//表单对象

publicshowLoading=false;

publicmessageTips:

string;

publiclogin_subscribe:

any;

//Validators的写法注意事项

//v2.x版本这样的写法是可行的,v4有调整,不然不会生效

//'UserName':

'',[Vpose([Validators.minLength(6)]

//v4+,第一位的''代表这个元素初始化构建为空值,类似未输入状态

//'UserName':

['',Vpose([Validators.minLength(6)]

//Validators可选参数

//1.required:

必须验证的,返回布尔值

//2.minLength:

最小长度

//3.maxLenght:

最大长度

//4.nullValidator:

空值判断

//5.coompose:

多重判断组合,下面有写法

//6.pattern是支持正则模式,正则谨记转义转义转义

constructor(privatefb:

FormBuilder,privaterouter:

Router,privateaccount:

AccountService){

this.form=fb.group({

'UserName':

['',Vpose([Validators.minLength(6)||Validators.pattern('(0|86|17951)?

(-)?

1[3,4,5,7,8,9]\\d{9}')||Validators.pattern('[\\.a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+')])],

'PassWord':

['',Vpose([Validators.required,Validators.pattern('\\w{8,16}')])],

'rememberAccount':

['']

});

}

ngOnInit(){

}

//登录事件

onSubmit(e){

this.showLoading=true;

this.login_subscribe=this.account.login(e.value).subscribe((res)=>{

console.log('省略。

')

},(err)=>{

this.showLoading=false;

});

}

ngOnDestroy(){

if(this.login_subscribe){

this.login_subscribe.unsubscribe();

}

}

}

效果图

嵌套表单

有些时候我们接口数据层次不可能只有一层,出现两层三层都有可能;

这时候需要我们构建一个嵌套表单。

html

v2-的写法:

表单的取值可以用controls直接点出来

form.controls.RuleContent.controls.FenceName.invalid&&form.controls.RuleContent.controls.FenceName.value,'has-success':

form.controls.RuleContent.controls.FenceName.valid&&form.controls.RuleContent.controls.FenceName.value}">

速度栅栏名称

不超过十个字

form.controls.RuleContent.controls.MaxSpeed.invalid&&form.controls.RuleContent.controls.MaxSpeed.value,'has-success':

form.controls.RuleContent.controls.MaxSpeed.valid&&form.controls.RuleContent.controls.MaxSpeed.value}">

速度阈值

km/h

保存

取消

v4+的写法:

嵌套表单的取值必须用.get()来获取,不然会报错误,具体原因是api改动了,看下官方文档就知道,改动了挺多(不仅仅这块)

form.get('RuleContent.FenceName').invalid&&form.get('RuleContent.FenceName').value,'has-success':

form.get('RuleContent.FenceName').valid&&form.get('RuleContent.FenceName').value}">

速度栅栏名称

不超过十个字

form.get('RuleContent.MaxSpeed').invalid&&form.get('RuleContent.MaxSpeed').value,'has-success':

form.get('RuleContent.MaxSpeed').valid&&form.get('RuleContent.MaxSpeed')ue}">

速度阈值

km/h

保存

取消

components.ts

import{Component,OnInit}from'@angular/core';

import{Router,ActivatedRoute}from'@angular/router';

import{FormGroup,FormControl,Validators,FormBuilder}from'@angular/forms';//

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1