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 相关文章推荐
jQuery对象初始化的传参方式
Feb 26 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
Mar 09 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
Jun 07 Javascript
详解Vue 方法与事件处理器
Jun 20 Javascript
Webpack性能优化 DLL 用法详解
Aug 10 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
May 09 Javascript
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
vue数据操作之点击事件实现num加减功能示例
Jan 19 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
完美解决vue 中多个echarts图表自适应的问题
Jul 19 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
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
详解python中eval函数的作用
2019/10/22 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
python设置表格边框的具体方法
2020/07/17 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
python安装sklearn模块的方法详解
2020/11/28 Python
Python中os模块的简单使用及重命名操作
2021/04/17 Python
golang 实用库gotable的具体使用
2021/07/01 Golang
Java后台生成图片的完整步骤
2021/08/04 Java/Android
基于Python实现西西成语接龙小助手
2022/08/05 Golang