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: ‘密码输入不不匹配‘
      }
    })

这样,我们就可以完成密码的校验了,效果如下:

截止这里,小目标中的其他组件也都类似,这里就不一一例举了

原文地址:https://www.cnblogs.com/baiyunchen/p/8489485.html

时间: 2024-10-08 06:49:04

Angular动态表单生成(四)的相关文章

Angular动态表单生成(七)

动态表单生成之拖拽生成表单(上) 这个功能就比较吊炸天了,之前的六篇,都是ng-dynamic-forms自带的功能,可能很多的说明官方的文档都已经写了,我只是个搬运工,而在这篇文章中,我将化身一个工程师,来自己创造点东西,让我们一起来期待吧~ 导入相关类库 拖拽功能看似吊炸天,其实HTML5中已经有一套标准来定义它了,所以并没有那么难以实现,这篇关于拖拽的文章写得还可以,大家可以先看看:http://www.zhangxinxu.com/wordpress/2011/02/html5-drag

Angular动态表单生成(二)

ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请大家多多指正. 整体结构分析 ng-dynamic-forms的主要代码均分布在packages文件夹下,其中的Core是各种控件的抽象,其他的文件夹是各个UI框架的具体封装,每个文件夹都是一个可独立编译运行的项目. Core文件夹内容分析 Core文件夹做的事情,基本上是对于各种组件.布局的抽象,

动态表单生成

1,创建sql drop table QUYJ_CHANGE_CARD; CREATE TABLE QUYJ_CHANGE_CARD ( ID VARCHAR(36) NOT NULL, phone VARCHAR2(100) NOT NULL, CITY VARCHAR2(50) NOT NULL, CREATE_BY VARCHAR2(32), CREATE_DATE DATE, CREATE_NAME VARCHAR2(32), UPDATE_BY VARCHAR2(32), UPDATE

angularjs 动态表单, 原生事件中调用angular方法

https://www.cnblogs.com/wancy86/p/7834067.html 1. 原生事件中调用angular方法, 比如 input的onChange事件想调用angular里面定义的方法 - onChange="angular.element(this).scope().uploadPhoto(this)" <div class="col-md-2"> <input onChange="angular.element

vue动态表单

项目需求,需要根据后台接口返回数据,动态添加表单内容 说明:此组件基于Ant Design of Vue 目前支持六种表单控件:文本输入框(TextInput).文本域输入框(TextArea).下拉选择框(SelectInput).下拉多选(SelectMultiple).日期(DataPicker).日期精确到秒(DataPickerSen) 一.文本框 1 <template> 2 <a-form-item :label="label" v-bind="

2017.2.28 activiti实战--第六章--任务表单(一)动态表单(待)

学习资料:<Activiti实战> 第六章 任务表单(一)动态表单 内容概览:本章要完成一个OA(协同办公系统)的请假流程的设计,从实用的角度,讲解如何将activiti与业务紧密相连. 第四章中讲解了两种表单:动态表单和外置表单的区别.这里将使用不同的表单来完成相同的功能. 1 动态表单:<activiti:formProperty> 2 外置表单:<activiti:formKey>

javaweb日记选(动态表单及表的实现)

Java语言也可以创建动态表单,如javaweb创建表单及表 应用场景 项目中往往需要动态的创建一个表单,或者添加一个新的数据模板,这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重. 实现工具 Hibernate + Spring + Groovy +Freemarker Hibernate 作用很简单负责创建数据库表这样可以避免我们自己去写复杂的sql和判断. Spring 作为桥梁起到连接纽带的作用 Groovy 做为动态语言,在项目运行

如何在.Net Core MVC中为动态表单开启客户端验证

非Core中的请参照: MVC的验证 jquery.validate.unobtrusive mvc验证jquery.unobtrusive-ajax 参照向动态表单增加验证 页面引入相关JS: <script src="~/lib/jquery/dist/jquery.js"></script> <script src="~/lib/jquery-validation/dist/jquery.validate.js"></

动态表单数据库设计

需求: 能够根据数据库在界面动态显示表单,包括表单类型.名称等,并且必须提供 添加新表单,修改表单等功能. 为了满足客户不断的需求变化,有时候需要为某商品增加.修改.删除.属性,这样的话以往的数据库表就很难实现, 因为表的字段是定死了 如果你需要增加一个属性的时候 ,就必须修改表,听说这是不允许的~~. 所以我们要设计一个灵活的数据库 下面以电脑设备为例: pc 现有属性 name cpu ram disk 现在我们要为pc添加一个 mainboard 属性. 既然必须提供增加表单,那么我们创建