实战 — 更新模型(为了迎合ui升级)

最后更新于:2022-04-02 08:10:56

>[success] # 更新模型 ~~~ 1.随着业务逐渐在使用,'element-ui' 和 'iview'等 一系列'ui-框架',我们的模型 也需要对应这些框架做对应的升级 ~~~ >[danger] ##### 升级'BaseModel' [async-validator](https://github.com/yiminghe/async-validator) 这类框架基于的验证库 ~~~ 1.例如'element-ui' 使用方法' { validator: validatePass2, trigger: 'blur' }' 其中'validatePass2' 是自定义的验证方法,我们更具这个条件来改进我们 'BaseModel' 只要保证'validatorOf' 返回的是等价'validatePass2'这种格式 var validatePass2 = (rule, value, callback) => { if (value === '') { callback(new Error('请再次输入密码')); } else if (value !== this.ruleForm.pass) { callback(new Error('两次输入密码不一致!')); } else { callback(); } }; ~~~ * 公司版本 ~~~ class ValidatableObject { // 查当前类生成的实例,对应的指定字段映射的验证类 decoratorsOf( property, metaKey = KEY_DECO_VALIDATORS) { const rs = Reflect.getMetadata(metaKey, this, property) return Array.isArray(rs) ? rs : [rs] } validatorOf(property, args) { const self = this return async function(rule, value, callback) { const vArr = self.decoratorsOf(property, KEY_DECO_VALIDATORS) if (vArr) { const val = self[property] for (const it of vArr) { if (!(await it.validate(val, args))) { callback(new Error(it.errorMessage)) return } } } callback() } } } ~~~ * 个人认为实际有用版本 ~~~ import {KEY_DECO_VALIDATORS} from '../untils/decorators' export default class BaseModel{ // 查当前类生成的实例,对应的指定字段映射的验证类 decoratorsOf( property, metaKey = KEY_DECO_VALIDATORS) { const rs = Reflect.getMetadata(metaKey, this, property) return Array.isArray(rs) ? rs : [rs] } validatorOf(property, args) { return async (rule, value, callback)=> { const vArr = this.decoratorsOf(property, KEY_DECO_VALIDATORS) if (vArr) { const val = this[property] for (const it of vArr) { if (!(await it.validate(val, args))) { callback(new Error(it.errorMessage)) return } } } callback() } } } ~~~
';