验证时使另一个字段无效

时间:2013-06-14 04:30:47

标签: javascript validation angularjs angularjs-directive

我正在处理标准的“更改密码”表单,其中有两个字段:password1和password2。这两个字段只是为了验证用户输入正确的密码,他们需要包含相同的文本。

我添加了一个验证密码的指令,但现在我想要,如果两个字段彼此不相等,请使两个字段都无效,而不仅仅是我输入的字段。我可以这样做吗?

我尝试在两个ngmodel上调用$ setValidity,但是我找不到从一个ctrl调用的方法。$ parsers.unshift或指令链接函数$ ​​setValidity或我当前没有验证的其他字段。我真的迷路了..

非常感谢!

我的指示是:<​​/ p>

myApp.directive('validatepassword', function () {
    return {
        require: 'ngModel',
        restrict: 'A', // only activate on element attribute
        link: function (scope, elm, attrs, ngModel) {
            ngModel.$parsers.unshift(function (viewValue) {
                var valPasswordValue = attrs.validatepassword;
                var otherPassword = $('#' + valPasswordValue)[0].value;
                var valido = scope.validatePassword(viewValue, otherPassword);
                ngModel.$setValidity('password', valido);
                return viewValue;
            });
        }
    };
});

我在代码中以这种方式使用:

        <div class="control-group">
            <label class="control-label" for="inputPassword1">Password</label>
            <div class="controls">
                <input id="inputPassword1" name="inputPassword1" type="password" ng-model="context.Password" required validatepassword="inputPassword2"/>
                <span class="alert-danger invalid-form" ng-show="!addEditForm.inputPassword1.$valid">(*)</span>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="inputPassword2">Repeat Password</label>
            <div class="controls">
                <input id="inputPassword2" name="inputPassword2" type="password" ng-model="context.Password2" required validatepassword="inputPassword1"/>
                <span class="alert-danger invalid-form" ng-show="!addEditForm.inputPassword2.$valid">(*)</span>
            </div>
        </div>

有关如何在其中一个字段发生更改后立即验证这两个字段的任何想法?

非常感谢!

3 个答案:

答案 0 :(得分:3)

要从另一个字段中的一个字段触发验证方法,我必须手动设置另一个字段的值。你可以在ng-change中做到这一点:

ng-change="addEditForm.inputPassword2.$setViewValue(addEditForm.inputPassword2.$viewValue)"

当你这样做时,它应该在两个密码字段中触发验证。

您还可以访问指令内的字段,如下所示:

scope.addEditForm.inputPassword1

因此,您可以摆脱指令内的jQuery访问。

以下是适用于两个字段的密码验证的HTML部分:

<div class="control-group">
    <label class="control-label" for="inputPassword1">Password</label>

    <div class="controls">
        <input id="inputPassword1" name="inputPassword1" type="password" ng-model="context.Password" required
               validatepassword="inputPassword2" ng-change="addEditForm.inputPassword2.$setViewValue(addEditForm.inputPassword2.$viewValue)"/>
        <span class="alert-danger invalid-form" ng-show="!addEditForm.inputPassword1.$valid">(*)</span>
    </div>
</div>
<div class="control-group">
    <label class="control-label" for="inputPassword2">Repeat Password</label>

    <div class="controls">
        <input id="inputPassword2" name="inputPassword2" type="password" ng-model="context.Password2" required
               validatepassword="inputPassword1" ng-change="addEditForm.inputPassword1.$setViewValue(addEditForm.inputPassword1.$viewValue)"/>
        <span class="alert-danger invalid-form" ng-show="!addEditForm.inputPassword2.$valid">(*)</span>
    </div>
</div>

答案 1 :(得分:2)

Angular-UI有一个内置的验证器,可以用于各种目的,有密码和确认密码的确切示例,您可以检查: https://github.com/angular-ui/ui-utils/blob/master/modules/validate/demo/index.html#L29

答案 2 :(得分:1)

请检查这个小提琴 http://jsfiddle.net/vigneshvdm/Dnt7w/5/

你可以做这样的事情

var password=$("#telephone").val();
var reenteredpassword=$("#mobile").val();

if(password==reenteredpassword)
{
$("#required").html("Passwords Match");
}
else
{
$("#required").html("Passwords do not Match");
}