Angular动态表单生成(四)
ng-dynamic-forms实践篇(下)
我们接着上篇,先把小目标中的所有字段都定义出来
这部分就是苦力活儿了,把KendoUiComponent中的formModel完善即可:

1 formModel: DynamicFormControlModel[] = [
2 new DynamicInputModel({
3 id: 'firstName',
4 label: '姓名',
5 placeholder: '请输入用户姓名'
6 }),
7 new DynamicRadioGroupModel({
8 id: 'sex',
9 legend: '性别',
10 options: [
11 {
12 label: '男',
13 value: 'M'
14 },
15 {
16 label: '女',
17 value: 'F'
18 }
19 ]
20 }),
21 new DynamicInputModel({
22 id: 'age',
23 inputType: 'number',
24 label: '年龄',
25 placeholder: '请输入用户年龄',
26 min: 0,
27 max: 150,
28 step: 1,
29 value: 18
30 }),
31 new DynamicDatePickerModel({
32 id: 'birthday-date',
33 inline: false,
34 label: '出生日期',
35 placeholder: '请选择出生日期'
36 }),
37 new DynamicTimePickerModel({
38 id: 'birthday-time',
39 label: '出生时分',
40 format: 'HH:mm'
41 }),
42 new DynamicInputModel({
43 id: 'password',
44 inputType: 'password',
45 label: '密码',
46 placeholder: '请输入用户密码'
47 }),
48 new DynamicInputModel({
49 id: 'password-confirm',
50 inputType: 'password',
51 label: '确认密码',
52 placeholder: '请再次输入用户密码'
53 }),
54 new DynamicSelectModel({
55 id: 'education',
56 label: '学历',
57 options: [
58 {
59 label: '大学',
60 value: 'university'
61 },
62 {
63 label: '高中',
64 value: 'high-school'
65 },
66 {
67 label: '初中',
68 value: 'junior-school'
69 },
70 ]
71 }),
72 new DynamicCheckboxGroupModel({
73 id: 'favorite',
74 legend: '兴趣爱好',
75 group: [
76 new DynamicCheckboxModel({
77 id: 'play-games',
78 label: '打游戏'
79 }),
80 new DynamicCheckboxModel({
81 id: 'coding',
82 label: '写代码'
83 }),
84 new DynamicCheckboxModel({
85 id: 'running',
86 label: '跑步'
87 }),
88 ]
89 }),
90 new DynamicTextAreaModel({
91 id: 'remark',
92 label: '备注',
93 rows: 10
94 }),
95 new DynamicFileUploadModel({
96 autoUpload: true,
97 id: 'attachments',
98 label: 'Attachments',
99 multiple: true,
100 removeUrl: 'removeUrl',
101 url: 'saveUrl'
102 }),
103 new DynamicFileUploadModel(
104 {
105 id: 'head-photo',
106 label: '头像',
107 accept: '*.*',
108 autoUpload: true,
109 multiple: true,
110 removeUrl: 'removeUrl',
111 url: 'http://localhost:60155/api/file/upload'
112 }
113 )
114 ];
formModel
这里的各种控件模型的初始化,可以查看DynamicXXXXModel的属性定义, 也可以参考官方github里面的examples:https://github.com/udos86/ng-dynamic-forms/blob/master/sample/app/ui-kendo/kendo-sample-form.model.ts。
接下来,我们再尝试加一下验证相关的代码:
验证分两类,一类是系统内置的验证,比如非空验证、最大长度、最大值、正则表达式之类的,另外一类是自定义的验证逻辑,下面我们分别来看看怎么用吧~
系统内置验证
这个用起来比较简单,直接在模型上加上validators属性和errorMessages属性即可,如下代码:
new DynamicInputModel({
id: 'firstName',
label: '姓名',
placeholder: '请输入用户姓名',
validators: {
required: null,
maxLength: 15
},
errorMessages: {
required: '{{label}}不能为空',
maxLength: '{{label}}不能超过15个字符'
}
})
其中validators中定义了你需要做哪些验证,以及这些验证方法需要传递的参数是什么。errorMessages中定义了当错误发生时的错误消息。最终效果如下:

自定义验证
有时候,系统验证不完全能满足我们的需求,此时需要自己定义一些验证的方法。比如,我们需要在用户注册时,检查用户两次输入的密码是否一致。
在使用时,首先我们需要定义一个验证的方法,代码如下,该方法中,会将password和password-confirm从表单中取出,并获得value,如果他们两个的Value不一致,则返回对象:{customMatchPasswordValidator: true}
import {AbstractControl, FormGroup, ValidationErrors} from '@angular/forms';
export function customMatchPasswordValidator(group: FormGroup): ValidationErrors | null {
console.log(group);
console.log(group.get('password'));
const password = group.get('password').value,
passWordConfirm = group.get('password-confirm').value;
const hasError = password != passWordConfirm;
return hasError ? {customMatchPasswordValidator: true} : null;
}
然后在app.modules.ts中导入它:
import {customMatchPasswordValidator} from './kendo-ui/password-validation';
还需要在app.modules.ts的providers中注入:
providers: [
{
provide: NG_VALIDATORS,
useValue: customMatchPasswordValidator,
multi: true
},
{
provide: DYNAMIC_VALIDATORS,
useValue: new Map<string, Validator | ValidatorFactory>([
['customMatchPasswordValidator', customMatchPasswordValidator]
])
}
]
由于是要同时获取两个控件的值,所以需要将两个密码框的模型放到一个DynamicFormGroupModel中,并且我们的验证也需要加到DynamicFormGroupModel中,代码如下:
new DynamicFormGroupModel({
id: 'password-group',
group: [
new DynamicInputModel({
id: 'password',
inputType: 'password',
label: '密码',
placeholder: '请输入用户密码'
}),
new DynamicInputModel({
id: 'password-confirm',
inputType: 'password',
label: '确认密码',
placeholder: '请再次输入用户密码'
})
],
validators: {
customMatchPasswordValidator: null
},
errorMessages: {
customMatchPasswordValidator: '密码输入不不匹配'
}
})
这样,我们就可以完成密码的校验了,效果如下:

截止这里,小目标中的其他组件也都类似,这里就不一一例举了
Angular动态表单生成(四)的更多相关文章
- Angular动态表单生成(八)
动态表单生成之拖拽生成表单(下) 我们的动态表单,最终要实现的效果与Form.io的在线生成表单的效果类似,可以参考它的demo地址:https://codepen.io/travist/full/x ...
- Angular动态表单生成(七)
动态表单生成之拖拽生成表单(上) 这个功能就比较吊炸天了,之前的六篇,都是ng-dynamic-forms自带的功能,可能很多的说明官方的文档都已经写了,我只是个搬运工,而在这篇文章中,我将化身一个工 ...
- Angular动态表单生成(一)
好久不写博客了,手都生了,趁着最近老大让我研究动态表单生成的时机,撸一发博客~~ 开源项目比较 老大丢给我了两个比较不错的开源的动态表单生成工具,这两个项目在github上的star数量基本持平: h ...
- Angular动态表单生成(五)
动态表单生成之布局 到上面的篇章为止,我们已经把表单比较完整的生成出来了,也实现了一些验证功能,可以说,我们截止这里,就已经可以满足我们的大部分表单生成需求了~ 但是: 目前来说,我们对于表单的布局只 ...
- Angular动态表单生成(六)
动态表单之根据Json生成表单 我们在实际的使用中,动态表单往往是由服务器端的一系列配置,然后返回数据给客户端,最后客户端根据数据来动态的生成表单.那么怎么像我们上面所描述的这样,生成一个可以让我们的 ...
- Angular动态表单生成(二)
ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请 ...
- Angular动态表单生成(三)
ng-dynamic-forms实践篇(上) 定个小目标 先来定个小目标吧,我们要实现的效果: 动态生成一个表单,里面的字段如下: 字段名称 字段类型 验证 备注 姓名 text 必填,长度小于15 ...
- form-create 3.0 版本发布,好用的Vue3版本动态表单生成组件
form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持2个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...
- Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...
随机推荐
- 正能量:You Are the Best
Success comes from knowing that you did your best to become the best that you are capable of becomin ...
- 关于j使用ava匿名类的好处总结
匿名类,除了只能使用一次,其实还有其他用处,比如你想使用一个类的protected方法时,但是又和这个类不在同一个包下,这个时候匿名类就派上用场了,你可以定义一个匿名类继承这个类,在这个匿名类中定义一 ...
- JS 时间转化为几分钟前 几小时前 几天前
背景:最近公司要做动态列表,类似于微信朋友圈.动态创建时间就需要显示为 刚刚.几分钟前.几小时前.几天前.2018-05-15,这样的形式. 代码如下 var minute = 1000 * 60; ...
- MVP 模式简单易懂的介绍方式
为什么用Android MVP 设计模式? 当项目越来越庞大.复杂,参与的研发人员越来越多的时候,MVP 模式 的优势就充分显示出来了. MVP 模式是 MVC 模式在 Android 上的一种变体, ...
- Flutter:Slivers大家族,让滑动视图的组合变得很简单!
今天呢,我小拉面主要想给大家讲一讲Flutter中的Slivers大家族的使用场景和方法.开发过列表布局的同学们应该对Slivers系列的控件不陌生,或多或少都用过这个库中的控件,来解决复杂的滑动嵌 ...
- android--Git上克隆项目遇到的坑
直接上图,首先你得有你得GitHub项目地址,如下: 然后打开android studio,选择新建项目时从Git上克隆: 点击clone等待完成,新窗口打开. 打开之后可能.或许.大概.也许会出现下 ...
- Django settings介绍
""" Django settings for macboy project. Generated by 'django-admin startproject' usin ...
- PRINCE2是什么?
PRINCE是PRoject IN Controlled Environment(受控环境下的项目管理)的简称. PRINCE2描述了如何以一种逻辑性的.有组织的方法,按照明确的步骤对项目进行管理. ...
- Spring手册
一.Spring 简介 二.结构体系 三.七大主要模块 四.Spring Maven依赖 五 .Sprinf framework 一.Spring 简介 spring是一个开源的轻量级的应用开发框架, ...
- apache url rewrite及正则表达式笔记
什么是mod_rewrite? mod_rewrite是apache一个允许服务器端对请求url做修改的模块.入端url将和一系列的rule来比对.这些rule包含一个正则表达式以便检测每个特别的模式 ...