实战 — 更新模型(为了迎合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()
}
}
}
~~~
';