|
|
import Schema from '../common/async-validator/index';
|
|
|
import validator from '../behaviors/validator';
|
|
|
|
|
|
/**
|
|
|
* @param tipType String [toast , message , text]
|
|
|
*/
|
|
|
// eslint-disable-next-line no-undef
|
|
|
export default Behavior({
|
|
|
behaviors: [validator],
|
|
|
properties: {
|
|
|
// 校验
|
|
|
rules: {
|
|
|
type: [Object, Array],
|
|
|
value: []
|
|
|
},
|
|
|
tipType: {
|
|
|
type: String,
|
|
|
value: 'toast',
|
|
|
options: ['toast', 'message', 'text']
|
|
|
}
|
|
|
},
|
|
|
data: {
|
|
|
schema: '',
|
|
|
tipFun: {
|
|
|
'message': 'showMessage',
|
|
|
'toast': 'showToast',
|
|
|
},
|
|
|
tipContent: {
|
|
|
'message': 'content',
|
|
|
'toast': 'title',
|
|
|
},
|
|
|
errorText: '',
|
|
|
errors: []
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
initRules() {
|
|
|
// const rulesName = this.data.name;
|
|
|
const {
|
|
|
rules
|
|
|
} = this.data;
|
|
|
if (!rules) return;
|
|
|
// 如果rule 是单个object
|
|
|
if (Object.prototype.toString.call(rules) === '[object Object]') {
|
|
|
this.data.rules = [rules];
|
|
|
}
|
|
|
|
|
|
this.data.rules.forEach(item => {
|
|
|
if (!item.trigger) {
|
|
|
item.trigger = [];
|
|
|
return;
|
|
|
}
|
|
|
if (typeof item.trigger === 'string') {
|
|
|
item.trigger = [item.trigger];
|
|
|
return;
|
|
|
}
|
|
|
// if(Object.prototype.toString.call(item.trigger) === '[object Object]') {
|
|
|
// item.trigger = ['blur'];
|
|
|
// return;
|
|
|
// }
|
|
|
});
|
|
|
|
|
|
},
|
|
|
getNeedValidateRule(type) {
|
|
|
const rulesName = this.data.name;
|
|
|
const {
|
|
|
rules
|
|
|
} = this.data;
|
|
|
if (!rules) return;
|
|
|
|
|
|
const list = type ? rules.filter(item => {
|
|
|
return item.trigger.indexOf(type) > -1;
|
|
|
}) : rules;
|
|
|
const schema = new Schema({
|
|
|
[rulesName]: list,
|
|
|
});
|
|
|
this.setData({
|
|
|
schema,
|
|
|
});
|
|
|
return list;
|
|
|
},
|
|
|
validatorData(value, type) {
|
|
|
const {
|
|
|
tipType,
|
|
|
tipFun,
|
|
|
tipContent
|
|
|
} = this.data;
|
|
|
const rules = this.getNeedValidateRule(type);
|
|
|
|
|
|
if (!rules) return;
|
|
|
|
|
|
// 把空字符串设置为 undefined ,见 issue 856
|
|
|
// async-validator 对空字符串会进行类型检查,与required会冲突
|
|
|
Object.getOwnPropertyNames(value).forEach((key) => {
|
|
|
if (value[key] === '') {
|
|
|
value[key] = undefined;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
this.data.schema.validate(value, (errors) => {
|
|
|
this.setData({
|
|
|
errors: errors || []
|
|
|
});
|
|
|
|
|
|
this.triggerEvent('linvalidate', {
|
|
|
errors,
|
|
|
isError: !!errors
|
|
|
});
|
|
|
|
|
|
if (errors && tipType) {
|
|
|
const funName = tipFun[tipType];
|
|
|
const contentName = tipContent[tipType];
|
|
|
if (tipType === 'text') {
|
|
|
this.setData({
|
|
|
errorText: errors[0].message
|
|
|
});
|
|
|
return errors;
|
|
|
}
|
|
|
|
|
|
if (!wx.lin || !wx.lin[funName]) {
|
|
|
wx.showToast({
|
|
|
icon: 'none',
|
|
|
title: `请在页面内引入${tipType}组件`
|
|
|
});
|
|
|
return errors;
|
|
|
}
|
|
|
|
|
|
wx.lin[funName] && wx.lin[funName]({
|
|
|
[contentName]: errors[0].message,
|
|
|
duration: 1500,
|
|
|
mask: false,
|
|
|
});
|
|
|
return errors;
|
|
|
} else if (!errors && tipType) {
|
|
|
this.setData({
|
|
|
errorText: ''
|
|
|
});
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
}
|
|
|
});
|