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动态表单生成(四)的更多相关文章

  1. Angular动态表单生成(八)

    动态表单生成之拖拽生成表单(下) 我们的动态表单,最终要实现的效果与Form.io的在线生成表单的效果类似,可以参考它的demo地址:https://codepen.io/travist/full/x ...

  2. Angular动态表单生成(七)

    动态表单生成之拖拽生成表单(上) 这个功能就比较吊炸天了,之前的六篇,都是ng-dynamic-forms自带的功能,可能很多的说明官方的文档都已经写了,我只是个搬运工,而在这篇文章中,我将化身一个工 ...

  3. Angular动态表单生成(一)

    好久不写博客了,手都生了,趁着最近老大让我研究动态表单生成的时机,撸一发博客~~ 开源项目比较 老大丢给我了两个比较不错的开源的动态表单生成工具,这两个项目在github上的star数量基本持平: h ...

  4. Angular动态表单生成(五)

    动态表单生成之布局 到上面的篇章为止,我们已经把表单比较完整的生成出来了,也实现了一些验证功能,可以说,我们截止这里,就已经可以满足我们的大部分表单生成需求了~ 但是: 目前来说,我们对于表单的布局只 ...

  5. Angular动态表单生成(六)

    动态表单之根据Json生成表单 我们在实际的使用中,动态表单往往是由服务器端的一系列配置,然后返回数据给客户端,最后客户端根据数据来动态的生成表单.那么怎么像我们上面所描述的这样,生成一个可以让我们的 ...

  6. Angular动态表单生成(二)

    ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请 ...

  7. Angular动态表单生成(三)

    ng-dynamic-forms实践篇(上) 定个小目标 先来定个小目标吧,我们要实现的效果: 动态生成一个表单,里面的字段如下: 字段名称 字段类型 验证 备注 姓名 text 必填,长度小于15 ...

  8. form-create 3.0 版本发布,好用的Vue3版本动态表单生成组件

    form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持2个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...

  9. Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)

    Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...

随机推荐

  1. 注重结构、语义、用户体验的Tab选项卡

    效果如下图所示: HTML code: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  2. java应用破解之破解 jeb mips 2.3.3

    前言 jeb 的新版支持 mips的反编译 ,于是去官网申请一个试用版,试用版的限制还是比较多的,比如 使用时间验证,没法复制粘贴 等,于是想尝试看看能否破解,同时填了 java破解 这个坑. 修改版 ...

  3. Android 运行时权限处理(from jianshu)

    https://www.jianshu.com/p/e1ab1a179fbb 翻译的国外一篇文章. android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 ...

  4. OkHttp2.0有Bug,暂时不推荐在产品中使用

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4078137.html 之前在博客里推荐使用OkHttp来替换 ...

  5. ASP.NET Claims-based认证实现认证登录-claims基础知识

    claims-based认证这种方式将认证和授权与登录代码分开,将认证和授权拆分成另外的web服务.活生生的例子就是我们的qq集成登录,未必qq集成登录采用的是claims-based认证这种模式,但 ...

  6. Linux安装Tomcat服务器发布项目教程

    前面小Alan跟大家聊了在Linux服务器上jdk运行环境的安装以及redis非关系型数据库的安装,今天继续跟大家聊聊Tomcat的安装,以及将我们的项目发布上去并成功的访问. 第一步:将tomcat ...

  7. CCSUOJ评测系统——第一次scrum冲刺

    1.第一次冲刺任务安排 对Github上的HUSTOJ开源项目进行Fork,搭建基本环境 2.用户需求 ①基本功能显示在首页 ②能够提交题目并判题,并对自己所提交的题目正确性进行反馈,能够查看自己提交 ...

  8. save与Update的合并操作 标签: 关系映射 2017-07-13 15:11 7人阅读 评论(0) 收藏

    做save与update的方法合并操作时,判断条件是主体对象的ID是否存在. 但是当页面中,涉及到多个主体对象的关联对象时,情况变得复杂起来,特总结项目中的几点 一.页面中的VO对象属性可以分为三类: ...

  9. WCF3.5 SP1 参考源码索引

    http://www.projky.com/dotnet/WCF3.5SP1/Microsoft/InfoCards/AccessibilityApplicationManager.cs.htmlht ...

  10. Hibernate的increment主键生成机制带来的问题

    最近给学校做的系统,总出现主键插入冲突的问题.主键是通过hibernate自动生成的,设置increment属性,总出现Duplicate entry的错误.搜到解决方案如下: 在网站运行在apach ...