Javascript 控制器连接到指令进行验证

Javascript 控制器连接到指令进行验证,javascript,jquery,angularjs,angularjs-scope,angularjs-ng-repeat,Javascript,Jquery,Angularjs,Angularjs Scope,Angularjs Ng Repeat,您好,我想知道如何结合指令和控制器功能来验证表单 现在我正在用一个指令单独验证一个表单,如果有人没有填写字段,它会突出显示一个紫色字段,在我的控制器中,我重复相同的验证,以查看用户是否可以继续保存数据 指令.js .directive('highlightOnError', function() { return { restrict: 'A', require: 'ngModel', link: function(scope, element, attrs, ngM

您好,我想知道如何结合指令和控制器功能来验证表单

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

指令.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

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');
}

for(var i=0;i虽然这并不能直接回答您的问题,但这是一种可能对您有益的替代方法。首先创建一个服务来保存您的验证

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;
}

}]);
然后,使用此服务的指令:

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将其连接在一起:

<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>

激活您的帐户

{{usernameError}} {{passcodererror}} {{passwordError}} 请输入一个不是您的电子邮件地址的密码。 请重新输入相同的新密码。 激活
虽然这并不能直接回答您的问题,但这是一种可能对您有益的替代方法。首先创建一个服务来保存您的验证

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;
}

}]);
然后,使用此服务的指令:

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将其连接在一起:

<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>

激活您的帐户

{{usernameError}} {{passcodererror}} {{passwordError}} 请输入一个不是您的电子邮件地址的密码。 请重新输入相同的新密码。 激活
虽然这并不能直接回答您的问题,但这是一种可能对您有益的替代方法。首先创建一个服务来保存您的验证

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;
}

}]);
然后,使用此服务的指令:

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将其连接在一起:

<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>

激活您的帐户

{{usernameError}} {{passcodererror}} {{passwordError}} 请输入一个不是您的电子邮件地址的密码。 请重新输入相同的新密码。 激活
虽然这并不能直接回答您的问题,但这是一种可能对您有益的替代方法。首先创建一个服务来保存您的验证

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;
}

}]);
然后,使用此服务的指令:

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将其连接在一起:

<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>

激活您的帐户

{{usernameError}} {{passcodererror}} {{passwordError}} 请输入一个不是您的电子邮件地址的密码。 请重新输入相同的新密码。 激活

查看$broadcast/$on,或将范围变量绑定到指令中。您有没有示例?谢谢,但我不想剥夺您的搜索权;)。Lol。有很多这样的例子,都是满栈溢出。尝试谷歌搜索“指令和控制器之间共享数据”或“angularjs$broadcast”。或者别的什么。你只是想验证整个表单吗?如果所有输入都有效,则表单处于干净状态。你确定你真的需要像现在这样做吗?文档中关于表单的部分非常好,尤其是验证部分。@aet我简化了问题,但实际上我需要自己进行自定义验证,即XXX-XXX-XXXX中的电话号码格式。因此,这不仅仅是检查空值,否则我会选择ngModel。$invalid来检查表单中的空值,或者查看$broadcast/$on,或者将范围变量绑定到指令中。您有示例吗?谢谢你,但我不想剥夺你的搜索权。Lol。有很多这样的例子,都是满栈溢出。尝试谷歌搜索“指令和控制器之间共享数据”或“angularjs$broadcast”。或者别的什么。你只是想验证整个表单吗?如果所有输入都有效,则表单处于干净状态。你确定你真的需要像现在这样做吗?文档中关于表单的部分非常好,尤其是验证部分。@aet我简化了问题,但实际上我需要自己进行自定义验证,即XXX-XXX-XXXX中的电话号码格式。因此,这不仅仅是检查空值,否则我会选择ngModel。$invalid来检查表单中的空值,或者查看$broadcast/$on,或者将范围变量绑定到指令中。您有示例吗?谢谢你,但我不想剥夺你的搜索权。Lol。有很多这样的例子,都是满栈溢出。尝试谷歌搜索“指令和控制器之间共享数据”或“angularjs$broadcast”。或者别的什么。你只是想验证整个表单吗?如果所有输入都有效,则表单处于干净状态。你确定你真的需要像现在这样做吗?文档中关于表单的部分非常好,尤其是验证部分。@aet我简化了问题,但实际上我需要自己进行自定义验证,即XXX-XXX-XXXX中的电话号码格式。因此,这不仅仅是检查空值,否则我会选择ngModel。$invalid来检查表单中的空值,或者查看$broadcast/$on,或者将范围变量绑定到指令中。您有示例吗?谢谢你,但我不想剥夺你的搜索权。Lol。有很多这样的例子,都是满栈溢出。尝试谷歌搜索“指令和控制器之间共享数据”或“angularjs$broadcast”。或者别的什么。你只是想验证整个表单吗?如果所有输入都有效,则表单处于干净状态。你确定你真的需要这么做吗