控制器连接到指令进行验证 [英] controller connect to directive for validation

查看:15
本文介绍了控制器连接到指令进行验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何结合指令和控制器函数来验证表单?

Hi I was wondering how I can combine both a directive and controller function for validating a form?

现在我正在使用一个指令单独验证一个表单,如果有人没有填写该字段,它会突出显示一个紫色的字段,并且在我的控制器中我重复相同的验证以查看用户是否可以继续保存数据.

Right now I'm validating a form separately with a directive, which highlights a field purple if someone doesn't fill out the field and in my controller I repeat the same validation in order to see whether the user can proceed to saving the data.

指令.js

.directive('highlightOnError', function() {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, element, attrs, ngModel) {
      scope.$on('submit', function() {

        var border = '';
        if (ngModel.$invalid){
          border = 'magenta solid 1px';
          element.css('border', border);
        }  else
        {
          border="";
          element.css('border', border);
        }


      });
    }
  };
})

controller.js

controller.js

for(var i=0; i<formobject.length;i++){
  var key=formobject[i];
  var field =validation.formobject[key]; 
  if(validation.formobject.hasOwnProperty(formobject[i])){
     if(field==null){
      error_count++;
      break;   
    }
}
else{
 error_count++;
 break; 
}
}
if(error_count==0){
  //save data of form
      $scope.create();
}

else{
  alert('Please fill out highlighted fields');
}

谢谢

推荐答案

虽然这不能直接回答您的问题,但它是一种可能对您有益的替代方法.首先创建一个服务来保存您的验证.

Though this does not directly answer your question, it is an alternative approach that might benefit you. First create a service to hold your validations.

myApp.factory('ValidationService', [ '$log',
function($log) {

var validators = {
    passcode: {
        patterns: [
            {
                regex: /^[0-9]{8}$/,
                msg: "Please enter a valid 8 digit code."
            }
        ]   
    },
    password: {
        patterns: [
            {
                regex: /^.{8}.*$/,
                msg: "Please use at least 8 characters."
            },
            {
                regex: /((?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[0-9].*))|((?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[^a-zA-Z0-9].*))|((?=.*[A-Z].*)(?=.*[0-9].*)(?=.*[^a-zA-Z0-9].*))|((?=.*[a-z].*)(?=.*[0-9].*)(?=.*[^a-zA-Z0-9].*))/,
                msg: "Please use characters from 3 different categories."
            }
        ]
    },
    email: {
        patterns: [
            {
                regex: /^[^@]+@[^.]+[.][^.][^.]+.*$/,
                msg: "Please enter a valid email address."
            }
        ]
    },
    default: {
        patterns: [
            {
                regex: /^.*$/,
                msg: "Invalid validator specified. Check your html."
            }
        ]
    }
};

return {
    getValidator: getValidator
};

function getValidator(inputType) {
    if (validators[inputType]) {
        return validators[inputType];
    }
    return validators.default;
}

}]);

然后,使用此服务的指令:

Then, a directive to work with this service:

myApp.directive('inputValidator', [ '$log', 'ValidationService',
function($log, ValidationService) {
return {
    require: 'ngModel',
    link: function(scope, elem, attrs, ctrl) {

        ctrl.$parsers.unshift(function(viewValue) {
            if (typeof viewValue == 'undefined') {
                return viewValue;
            }
            var pass = true;
            var validator = ValidationService.getValidator(attrs.inputValidator);
            $.each(validator.patterns, function(index, pattern) {
                if (!pattern.regex.test(viewValue)) {
                    pass = false;
                    scope[attrs.inputValidatorMsg] = pattern.msg;
                    return false;
                }
            });

            if (pass) {
                // valid
                ctrl.$setValidity('inputValidator', true);
                return viewValue;
            } else {
                // invalid
                ctrl.$setValidity('inputValidator', false);
                return undefined;
            }
        });
    }
};
}]);

最后,一些 html 将它们联系在一起:

And finally, some html to tie it all together:

<form name="loginForm" class="css-form" data-novalidate>
            <p class="reset-header">Activate Your Account</p>

            <input type=text placeholder="Email Address" name="username" data-ng-model="username"
                    data-input-validator="email" data-input-validator-msg="usernameError" data-required>
            <span class="tag tag-alert arrow-top" data-ng-show="loginForm.username.$error.inputValidator">{{usernameError}}</span>

            <input type=text placeholder="Activation Code" name="passcode" data-ng-model="passcode"
                    data-input-validator="passcode" data-input-validator-msg="passcodeError" data-required>
            <span class="tag tag-alert arrow-top" data-ng-show="loginForm.passcode.$error.inputValidator">{{passcodeError}}</span>

            <input type=password placeholder="New Password" name="password" data-ng-model="password"
                    data-input-validator="password" data-input-validator-msg="passwordError" data-input-must-not-match="username" data-required>
            <span class="tag tag-alert arrow-top" data-ng-show="loginForm.password.$error.inputValidator">{{passwordError}}</span>
            <span class="tag tag-alert arrow-top" data-ng-show="!loginForm.password.$error.inputValidator && loginForm.password.$error.inputMustNotMatch">Please enter a password that is not your email address.</span>

            <input type=password placeholder="New Password Again" name="passwordConfirm" data-ng-model="passwordConfirm"
                    data-input-must-match="password" data-required>
            <span class="tag tag-alert arrow-top" data-ng-show="loginForm.passwordConfirm.$error.inputMustMatch">Please enter the same new password again.</span>

            <button class="btn btn-special" data-ng-disabled="loginForm.$invalid" data-ng-click="save()">Activate</button>
        </form>

这篇关于控制器连接到指令进行验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆