AngularJS使用angular-formly进行表单验证


Posted in Javascript onDecember 27, 2015

当验证表单中有很多字段时,这时候可能希望把html的生成以及验证逻辑放到controller中,在页面,也许是这样的:

<some-form fiedls="vm.someFields" ...></some-form>

然后,在controller中定义各个字段以及验证。angular-formly就是为这个需求而存在。

在controller中,把各个字段定义在数组中:

vm.rentalFields = [
{
key:'first_name',
type:'input',
templateOptions:{
type:'text',
label:'姓',
placeholder: '输入姓',
required: true
}
},
...
]

使用hideExpression字段定义隐藏的条件:

{
key:'under18',
type:'checkbox',
templateOptions:{
label:'是否不满18岁'
},
hideExpression: '!model.email' //email验证失败之前不显示
}

使用validators字段自定义验证规则:

{
key:'license',
type:'input',
templateOptions:{
label:'身份证号',
placeholder:'输入身份证号'
},
hideExpression: '!model.province',
validators:{
driversLicense: function($viewValue, $modelValue, scope){
var value = $modelValue || $viewValue;
if(value){
return validateDriversLicence(value);
}
},
expressionProperties:{
'templateOptions.disabled':function($viewValue, $modelValue, scope){
if(scope.model.province == '山东省'){
return false;
}
return true;
}
}
}

首先安装:npm install angular-formly angular-formly-templates-bootstrap bootstrap api-check

Demo的文件结构:

css/
.....style.css
node_modules/
scripts/
.....MainController.js
.....provinces.js [提供select的选项,有关省]

app.js

index.html

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="gb2312">
<title></title>
<link rel="stylesheet" href="css/style.css"/>
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css"/>
</head>
<body ng-app="formlyApp" ng-controller="MainController as vm">
<div class="container col-md-4 col-md-offset-4">
<form novalidate>
<formly-form model="vm.rental" fields="vm.rentalFields" form="vm.rentalForm">
<button type="submit" class="btn btn-primary" ng-disabled="vm.rentalForm.$invalid">提交</button>
</formly-form>
</form>
</div>
<!--项目依赖-->
<script src="node_modules/api-check/dist/api-check.js"></script>
<script src="node_modules/angular/angular.min.js"></script>
<script src="node_modules/angular-formly/dist/formly.js"></script>
<script src="node_modules/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.min.js"></script>
<!--项目引用-->
<script src="app.js"></script>
<script src="scripts/MainController.js"></script>
<script src="scripts/province.js"></script>
</body>
</html>

app.js

(function(){
'use strict';
angular.module('formlyApp',['formly','formlyBootstrap'])
})();

province.js

以factory的方式返回一个对象,包含获取select选项的方法。

(function(){
'use strict';

angular

.module('formlyApp')
.factory('province', province);
function province(){
function getProvinces(){
return [
{
"name":"山东省",
"value":"山东省"
},
{
"name":"江苏省",
"value":"江苏省"
}
];
}
return {
getProvinces:getProvinces
}
}
})();

MainController.js

(function(){
'use strict';
angular
.module('formlyApp')
.controller('MainController', MainController);

function MainController(province){
var vm = this;

vm.rental = {};

vm.rentalFields = [
{
key:'first_name',
type:'input',
templateOptions:{
type:'text',
label:'姓',
placeholder: '输入姓',
required: true
}
},
{
key:'last_name',
type:'input',
templateOptions:{
type:'text',
label:'名',
placeholder:'输入名',
required:true
}
},
{
key:'email',
type:'input',
templateOptions:{
type:'email',
label:'邮箱',
placeholder:'输入邮箱',
required:true
}
},
{
key:'under18',
type:'checkbox',
templateOptions:{
label:'是否不满18岁'
},
hideExpression: '!model.email' //email验证失败之前不显示
},
{
key: 'province',
type:'select',
templateOptions:{
label:'选择省',
options: province.getProvinces()
},
hideExpression: '!model.email'
},
{
key:'license',
type:'input',
templateOptions:{
label:'身份证号',
placeholder:'输入身份证号'
},
hideExpression: '!model.province',
validators:{
driversLicense: function($viewValue, $modelValue, scope){
var value = $modelValue || $viewValue;
if(value){
return validateDriversLicence(value);
}
},
expressionProperties:{
'templateOptions.disabled':function($viewValue, $modelValue, scope){
if(scope.model.province == '山东省'){
return false;
}
return true;
}
}
}
},
{
key: 'insurance',
type: 'input',
templateOptions:{
label:'保险',
placeholder:'输入保险'
},
hideExpression: '!model.under18 || !model.province'
}
];
function validateDriversLicence(value) {
return /[A-Za-z]\d{4}[\s|\-]*\d{5}[\s|\-]*\d{5}$/.test(value);
}
}
})();

以上内容是小编给大家分享的AngularJS使用angular-formly进行表单验证的全部叙述,希望大家喜欢。

Javascript 相关文章推荐
实现复选框全选/全不选切换
Dec 23 Javascript
用js统计用户下载网页所需时间的脚本
Oct 15 Javascript
js计算页面刷新的次数
Jul 20 Javascript
Jquery实现的一种常用高亮效果示例代码
Jan 28 Javascript
从零学JS之你需要了解的几本书
May 19 Javascript
jquery append()方法与html()方法的区别及使用介绍
Aug 01 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
JS实现页面进入和返回定位到具体位置
Dec 08 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 Javascript
bootstrap datepicker的基本使用教程
Jul 09 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 Javascript
JS操作字符串转数字的常见方法示例
Oct 29 Javascript
延时加载JavaScript代码提高速度
Dec 27 #Javascript
AngularJS使用ngMessages进行表单验证
Dec 27 #Javascript
详解maxlength属性在textarea里奇怪的表现
Dec 27 #Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 #Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 #Javascript
JavaScript的removeChild()函数用法详解
Dec 27 #Javascript
JavaScript构造函数详解
Dec 27 #Javascript
You might like
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
Python对数据进行插值和下采样的方法
2018/07/03 Python
python多线程并发实例及其优化
2019/06/27 Python
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
英国电气世界:Electrical World
2019/09/08 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
负责人任命书范本
2014/06/04 职场文书
创建文明城市标语
2014/06/16 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python