import { Injectable } from '@angular/core'; @Injectable() export class Verify { verifies = {} // 验证方法集合 constructor() { } /** * @param options 验证配置,如果为string则为format,同时支持数组和对象格式 * 数组则格式为[[format, message],...]或者为{format:message,...} * 详细格式message可以为对象,即[[format, {message:XXX,args:[]}],...] * 或者{format:{message:XXX,args:[]},...} * @returns {Function} */ check (...options) { let self = this; /** * 返回格式如{passed:false, errors:[{format: XXX,message:XXX}]} * 参数:value,... */ return function (...valueArgs) { let isPassed = true; for (var i = 0, n = options.length; i < n; i++) { var option = options[i]; var currPassed; var errors = []; if(Array.isArray(option)){ // 数组格式 for (let i = 0, n = option.length; i < n; i++) { var verify = option[i]; var key = verify[0]; var message = verify[1]; currPassed = checkHandle(key,message); isPassed = isPassed && currPassed; } }else{ // 对象格式(1个对象包含多个验证格式) for (let key in option) { let message = option[key]; currPassed = checkHandle(key,message); isPassed = isPassed && currPassed; } } } /** * 检查操作 * @param key 检查的字段名 * @param option 检查配置,默认为字符串则当做message处理 * @returns {*} */ function checkHandle(key, option) { if(!self.verifies[key]) throw new Error('不存在' + key + '格式'); var message = typeof option === 'string' ? option : option.message; // 部分验证需要的除value以外的额外参数 var args = typeof option === 'object' && option.args ? option.args : null; // 如果存在args,则先执行配置函数,然后再执行检测函数 currPassed = args ? self.verifies[key].apply(null, args).apply(null,valueArgs) : self.verifies[key].apply(null,valueArgs); if(!currPassed) errors.push({format: key, message: message}); return currPassed; } return { passed: isPassed, errors: errors }; } } /** * 创建基础验证方法 * @param name 方法名 * @param check 核心判断参数,可以为函数也可以为正则,如果为正则默认使用test校验 * @param reverse 是否反向校验 */ addVerify (name, check, reverse) { this.verifies[name] = function(value) { var isPassed = false; if(typeof check === 'function'){ isPassed = reverse ? !check.apply(null, arguments) : check.apply(null, arguments); }else{ isPassed = reverse ? !check.test(value) : check.test(value); } return isPassed; }; } /** * 批量添加验证方法 * @param args ['isNumber', format.is.number, false] */ addVerifies(...args){ //const args = Array.prototype.slice.call(arguments); for (var i = 0, n = args.length; i < n; i++) { var arg = args[i] this.addVerify(arg[0], arg[1], arg[2]); } } }