import { Injectable } from '@angular/core'; import { Verify } from './verify'; @Injectable() export class Validate { validates = {} constructor(public verify:Verify) { this.verify = verify; } /** * 验证待检查字段 * @param values 待检测的值对象,如 * {newPhone:18616016872,password:abc123,captcha:2345} * @param options 检测字段对象,如 * { * 'newPhone':'phone', * 'password':'password', * 'captcha':['captcha':{isLowerletter:'请输入正确验证码'}] * } */ check (values, options) { const finalResult = {passedAll:false}; let isPassed = true; for (let name in options) { var validate = options[name]; var result = this.checkOne(values[name], validate); isPassed = isPassed && result.passed; finalResult[name] = result; } finalResult.passedAll = isPassed; return finalResult; } /** * 验证单个待检查字段 * @param value 待检测的值,如果为数组,则当成多个参数,统一用apply执行 * @param validate 字符串如'phone'或数组如['captcha',{isLowerletter:'请输入正确验证码'}] * @param scope 将错误信息绑定的作用域,默认绑定如$scope.message.phone */ checkOne(value, validate) { if(!validate) return null; var key = Array.isArray(validate) ? validate[0] : validate; // 检测参数为数组类型,方便传入多参数 var args = Array.isArray(value) ? value : [value]; var result = Array.isArray(validate) ? this.verify.check(validate[1]).apply(null, args) : (this.validates[validate] ? this.validates[validate].apply(null, args): null); // 存在作用域,则将结果信息进行绑定 if(result) result.key = key; return result; } /** * 添加统一验证方法 * @param options 大的配置对象,类似如下: * { mobileNo:[['require','手机号不能为空'], ['isPhone','请输入正确的手机号码']], captcha: {require: '验证码不能为空', isLowerletter:'验证码输入错误'} * } */ addValidates(options) { for (var key in options) { this.validates[key] = this.verify.check(options[key]); } } }