w5cValidator.min.js
5.63 KB
/*! w5cValidator 2014-07-15 */
angular.module("w5c.validator",["ng"]).provider("w5cValidator",[function(){var a={required:"该选项不能为空",maxlength:"该选项输入值长度不能大于{maxlength}",minlength:"该选项输入值长度不能小于{minlength}",email:"输入邮件的格式不正确",repeat:"两次输入不一致",pattern:"该选项输入格式不正确",number:"必须输入数字",w5cuniquecheck:"该输入值已经存在,请重新输入"},b=["text","password","email","number",["textarea"],["select"],["select-one"]],c=function(){this.elemTypes=b,this.rules=[],this.isEmpty=function(a){return void 0===a||null===a?!0:a instanceof Array&&0===a.length?!0:!1},this.defaultShowError=function(a,b){var c=angular.element(a),d=c.parent().parent();this.isEmpty(d)||d.hasClass("has-error")||(d.addClass("has-error"),c.after('<span class="w5c-error">'+b[0]+"</span>"))},this.defaultRemoveError=function(a){var b=angular.element(a),c=b.parent().parent();!this.isEmpty(c)&&c.hasClass("has-error")&&(c.removeClass("has-error"),b.next(".w5c-error").remove())},this.options={blurTrig:!1}};c.prototype={constructor:c,config:function(a){this.options=angular.extend(this.options,a)},setRules:function(a){this.rules=a},getErrorMessage:function(b,c){var d=null;switch(this.isEmpty(this.rules[c.name])||this.isEmpty(this.rules[c.name][b])||(d=this.rules[c.name][b]),b){case"maxlength":return null!==d?d.replace("{maxlength}",c.getAttribute("ng-maxlength")):a.maxlength.replace("{maxlength}",c.getAttribute("ng-maxlength"));case"minlength":return null!==d?d.replace("{minlength}",c.getAttribute("ng-minlength")):a.minlength.replace("{minlength}",c.getAttribute("ng-minlength"));default:if(null!==d)return d;if(null===a[b])throw new Error("该验证规则("+b+")默认错误信息没有设置!");return a[b]}},getErrorMessages:function(a,b){var c=[];for(var d in b)if(b[d]){var e=this.getErrorMessage(d,a);c.push(e)}return c},showError:function(a,b,c){var d=angular.extend({},this.options,c);if(d.showError!==!1)return angular.element(a).removeClass("valid").addClass("error"),angular.isFunction(d.showError)?d.showError(a,b):d.showError===!0?this.defaultShowError(a,b):void 0},removeError:function(a,b){var c=angular.extend({},this.options,b);if(c.removeError!==!1)return angular.element(a).removeClass("error").addClass("valid"),angular.isFunction(c.removeError)?c.removeError(a):c.removeError===!0?this.defaultRemoveError(a):void 0}};var d=new c;this.config=function(a){d.config(a)},this.setRules=function(a){d.setRules(a)},this.$get=function(){return d}}]),angular.module("w5c.validator").directive("w5cFormValidate",["$parse","w5cValidator",function(a,b){return{link:function(c,d,e){var f=d[0],g=d.attr("name"),h=a(e.w5cSubmit),i=c.$eval(e.w5cFormValidate);e.w5cFormValidate&&c.$watch(e.w5cFormValidate,function(a){a&&(i=angular.extend({},b.options,a))},!0),i=angular.extend({},b.options,i);for(var j=0;j<f.length;j++){var k=f[j],l=angular.element(k);if(b.elemTypes.toString().indexOf(k.type)>-1&&!b.isEmpty(k.name)){var m=g+"."+k.name+".$viewValue";c.$watch("["+m+","+j+"]",function(a){var d=f[a[1]];c[g].$errors=[],b.removeError(d,i)},!0),i.blurTrig&&l.bind("blur",function(){if(i.blurTrig){var a=angular.element(this);if(c[g][this.name].$valid)b.removeError(a,i);else{var d=b.getErrorMessages(this,c[g][this.name].$error);b.showError(a,d,i)}}})}}var n=function(){for(var a=[],d=0;d<f.length;d++){var e=f[d];if(b.elemTypes.toString().indexOf(e.type)>-1&&!b.isEmpty(e.name)){if(c[g][e.name].$valid){angular.element(e).removeClass("error").addClass("valid");continue}var h=b.getErrorMessages(e,c[g][e.name].$error);a.push(h[0]),b.removeError(e,i),b.showError(e,h,i),angular.element(e).removeClass("valid").addClass("error")}}c[g].$errors=!b.isEmpty(a)&&a.length>0?a:[],c.$$phase||c.$apply(c[g].$errors)};c[g].doValidate=n,e.w5cSubmit&&angular.isFunction(h)&&(d.bind("submit",function(){n(),c[g].$valid&&angular.isFunction(h)&&c.$apply(function(){h(c)})}),d.bind("keydown keypress",function(a){if(13===a.which){var b=document.activeElement;"textarea"!==b.type&&(angular.element(this).find("button").focus(),b.focus(),n(),a.preventDefault(),c[g].$valid&&angular.isFunction(h)&&c.$apply(function(){h(c)}))}}))}}}]).directive("w5cFormSubmit",["$parse",function(a){return{link:function(b,c,d){var e=a(d.w5cFormSubmit),f=c.parents("form").attr("name"),g=b.$eval(f);if(!g)throw new Error("w5cFormSubmit form is empty.");c.bind("click",function(){angular.isFunction(g.doValidate)&&g.doValidate(),g.$valid&&angular.isFunction(e)&&b.$apply(function(){e(b)})}),c.parents("form").bind("keydown keypress",function(a){if(13===a.which){var c=document.activeElement;"textarea"!==c.type&&(this.find("button").focus(),c.focus(),angular.isFunction(g.doValidate)&&g.doValidate(),a.preventDefault(),g.$valid&&angular.isFunction(e)&&b.$apply(function(){e(b)}))}})}}}]).directive("w5cRepeat",[function(){"use strict";return{require:"ngModel",link:function(a,b,c,d){var e=b.inheritedData("$formController")[c.w5cRepeat];d.$parsers.push(function(a){return a===e.$viewValue?(d.$setValidity("repeat",!0),a):void d.$setValidity("repeat",!1)}),e.$parsers.push(function(a){return d.$setValidity("repeat",a===d.$viewValue),a})}}}]).directive("w5cUniqueCheck",["$timeout","$http",function(a,b){return{require:"ngModel",link:function(c,d,e,f){var g=function(){var a=c.$eval(e.w5cUniqueCheck),d=a.url,g=a.isExists;b.get(d).success(function(a){g===!1?f.$setValidity("w5cuniquecheck",a.data):f.$setValidity("w5cuniquecheck",!a.data)})};c.$watch(e.ngModel,function(a){_.isEmpty(a)||c[d[0].form.name][d[0].name].$dirty||g()}),d.bind("blur",function(){a(function(){c[d[0].form.name][d[0].name].$invalid||g()})}),d.bind("focus",function(){a(function(){f.$setValidity("w5cuniquecheck",!0)})})}}}]);