import { EmopItemClass } from "../EmopItemClass/EmopItemClass"; import { EmopFormProItemClass } from "./components/EmopFormProItemClass"; export class EmopFormProClass extends Array{ validateStatus: 'success' | 'error' = null; constructor(constructorData: EmopFormProItemClass[]) { super(); constructorData.forEach(item => { this.push(new EmopFormProItemClass(item)); }); } /** * 导出数据 * @return 返回标准数据 */ getData() { let resultData = {}; this.forEach(item => { if (item.enable || item.enable === undefined) resultData[item.key] = item.value; }); return resultData; } /** * 表单清空 */ clear() { this.forEach(item => { item.value = null; }); } /** * 表单校验 * 不会对enable或visible为false的数据进行校验 */ validate(checkAll?: boolean) { let flag = true; this.forEach(item => { if (item.enable && item.visible) { if (!this.validateItem(item)) flag = false; } }); this.validateStatus = flag ? 'success' : 'error'; return flag; } /** * 表单验证单个控件 * 不会对visible为false的数据进行检查 * @param options * @return boolean */ validateItem(item: EmopFormProItemClass): boolean { if (item.validate?.length) { item.validateStatus = 'success'; this.find(t => t.key === item.key).validate.forEach(p => { if (item.validateStatus !== 'error') { switch (p) { case 'required': item.errorTips = item.alias + '为必填项'; // 数字类型及布尔类型不需要进行校验 switch (item.mode) { // 数字类型可以为0 case 'num': if (item.value !== 0 && !item.value) { item.validateStatus = 'error'; } else { item.validateStatus = 'success'; } break; // 不需要进行任何处理,但是要写这个条件 case 'bool': break; case 'lov': if ((item.multiple || item.tags) && !item.value?.length) { item.validateStatus = 'error'; } // 特意删除了break default: if (!item.value) { item.validateStatus = 'error'; } break; } if (item.mode === 'num' || item.mode === 'bool') { } break; case 'phone': break; default: const customFnResult = p.fn(item.value, item); if (customFnResult === undefined) console.error('校验函数需要提供布尔类型的返回值'); if (customFnResult === false) { item.errorTips = p.errorTips; item.validateStatus = 'error'; } break; } } }); } return item.validateStatus !== 'error'; } }