Angular模版驱动表单的使用总结


Posted in Javascript onMay 05, 2018

表单的重要性就不多说了,Angular支持表单的双向数据绑定,校验,状态管理等,总结下。

获取用户输入

<div class="container-fluid login-page">
 <h1>Angular表单</h1>
 <form class="login-area">
  <div class="form-group">
    <input class="form-control" type="text" name="name" id="login-name" placeholder="请输入登录帐号">
  </div>
  <div class="form-group">
   <input class="form-control"type="password" name="pwd" id="login-pwd" placeholder="请输入登录密码">
  </div>
  <div class="form-group">
   <button type="submit" class="btn btn-block btn-success">登录</button>
  </div>
 </form>
</div>

假如有以上简单表单,先不论优劣,有哪些方式可以获取到表单数据呢? 先看两种简单粗暴的

1)事件$event的方式

在监听事件的时候,将整个事件载荷 $event 传递到事件处理函数,它会携带触发元素的各种信息。这里监听form元素的submit事件,将整个form的信息传给处理函数,并打印出来

<form class="login-area" (submit)="testInput($event)">
testInput ( _input: any) {
  console.dir(_input);
}

触发submit后,查看结果。非常眼熟,就是传统方式中的event嘛,后面就不用多说了,target即为form元素,再定位到input子元素,分别获取value即可。

Angular模版驱动表单的使用总结

为了获取input的Value,我们传递了非常多的无用信息,处理函数根本就不关心元素的位置,属性等等,它只需要value值。所以这种方式不可取

2) 模版引用变量

Angular中可以用 模版引用变量(#var)来引用DOM元素/Angular组件/指令。通常模版引用变量就是代表声明的那个元素,当然也可以修改指向,可以代表Angular指令(比如后续用到的ngForm指令和ngModel指令)。

// 模版引用变量代表Form元素
<form class="login-area" #test (submit)="testInput(test)">

// 模版引用变量代表ngForm指令
<form class="login-area" #test="ngForm"(submit)="testInput(test)">

从下图可以看到不同,第一个和$event.target一样,是DOM元素;第二个是ngForm指令,可以跟踪每个控件的值和状态(是否输入过?是否校验通过?等等),后续会详细说

Angular模版驱动表单的使用总结

所以当我们直接用模版引用变量引用input元素时,就可以直接在模版中传递input元素的value,而不需要传递整个元素信息。这种方式也不好,必须要通过事件触发才可以传递

<form class="login-area" (submit)="testInput(test.value)">
  <div class="form-group">
    <input class="form-control" #test type="text" name="name" id="login-name" placeholder="请输入登录帐号">
  </div>

注意:模版引用变量的作用域是整个模版,所以在同一个模版中,不能有同名的模版引用变量

这两种获取表单数据的方式只是了解下,因为Angular提供了两种更好的构建表单的方式---模版驱动表单和模型驱动表单

模版驱动表单

顾名思义,是使用 HTML模版 + 表单专业指令 来构建表单。使用模版驱动表单,记得要先在应用模块中import FormsModule。说明以下几点:

1、模版驱动表单使用 [(ngModel)] 语法进行双向数据绑定,非常简单就可以把表单数据绑定到模型中。注意在表单中使用[ngModel]时,必须要定义name属性,因为Angular在处理表单时,会创建一些FormControl,用来跟踪单个表单控件的值和状态,而表单控件name属性就是键值,所以必须要指定name属性。(这应该算是指出了获取表单数据的两种科学的方式:[ngModel]语法绑定 和 通过formControl的Api获取)

2、使用 ngForm指令,来监听整个表单的有效性(valid属性)。Angular会自动为form表单自动创建并添加ngForm指令,直接使用即可

3、使用ngModel指令,来监听单个表单控件的状态,还会使用特定的Angular css来更新控件样式 ,我们可以通过这些class来控制不同状态时,表单控件的展示 

Angular模版驱动表单的使用总结

4、表单验证可以使用 HTML原生的表单验证属性(required , pattern , max , min 等等) ,验证出错时,3中提到的errors属性就会有对应的错误项;

还可以自定义验证器,因为模版驱动表单不直接访问FormControl实例,所以需要把自定义的验证器用指令包装。

通过以下栗子来展示模版驱动表单简单使用

<!-- 模版引用变量指向ngForm指令 -->
 <form class="login-area" #testform="ngForm" (submit)="testInput()">
  <div class="form-group">
    <!-- ngModel绑定数据 -->
    <!-- required 和 pattern 指定校验规则 -->
    <!-- 模版引用变量指向ngModel指令 -->
    <input class="form-control" type="text" name="name" id="login-name" placeholder="请输入登录帐号"
        [(ngModel)] = "user.name"  
        required
        pattern="[0-9A-z]+"
        #nameinput = "ngModel"
        >
  </div>
    <!-- 通过表单控件的状态控制是否展示错误说明及展示何种错误说明 -->
  <div class="form-group" *ngIf="nameinput.touched&&nameinput.invalid">
    <span class="error-info" *ngIf="nameinput.errors?.required">用户名不能为空!</span>
    <span class="error-info" *ngIf="nameinput.errors?.pattern">用户名只能包含英文或数字!</span>
  </div>
  <div class="form-group">
   <input class="form-control" type="password" name="pwd" id="login-pwd" placeholder="请输入登录密码"
       [(ngModel)] = "user.pwd"
       required
       #pwdinput = "ngModel">
  </div>
  <div class="form-group" *ngIf="pwdinput.touched&&pwdinput.invalid">
   <span class="error-info" *ngIf="pwdinput.errors?.required">密码不能为空!</span>
  </div>
  <div class="form-group">
   <!-- 通过表单的状态控制按钮是否可用 -->
   <button type="submit" class="btn btn-block btn-success" [disabled]="testform.invalid">登录</button>
  </div>
 </form>

通过Angular css 自动添加的class来控制表单样式

input.ng-invalid.ng-touched{
    border: 2px solid red;
 }

查看下效果,表单校验、样式反馈、按钮状态管理、数据获取都很方便。

Angular模版驱动表单的使用总结

至于如何自定义验证器会和模型驱动表单的自定义验证器一起说明,那就是下一篇了;随笔中有不足的欢迎大家指正···

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 清空form表单中某种元素的值
Dec 26 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
Dec 25 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
Apr 27 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
JS实现表格数据各种搜索功能的方法
Mar 03 Javascript
javascript创建函数的20种方式汇总
Jun 23 Javascript
从零学习node.js之搭建http服务器(二)
Feb 21 Javascript
提升页面加载速度的插件InstantClick
Sep 12 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
详解开发react应用最好用的脚手架 create-react-app
Apr 24 Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
Aug 29 Javascript
浅谈Angular HttpClient简单入门
May 04 #Javascript
Vue项目全局配置微信分享思路详解
May 04 #Javascript
vue嵌套路由与404重定向实现方法分析
May 04 #Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 #Javascript
详解使用jQuery.i18n.properties实现js国际化
May 04 #jQuery
node实现的爬虫功能示例
May 04 #Javascript
基于jQuery.i18n实现web前端的国际化
May 04 #jQuery
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
利用Python实现kNN算法的代码
2019/08/16 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
精通CAD能手自荐书
2014/01/31 职场文书
办公室文员自荐书
2014/02/03 职场文书
教师产假请假条
2014/04/10 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
婚内房产协议书范本
2014/10/02 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python