条件验证不适用于匿名Knockout验证规则

Cri*_*ris 12 knockout.js knockout-validation

我的viewmodel中有以下属性,它们使用敲除验证,其中一个是自定义验证来检查密码匹配.

model.Password = ko.observable()
                  .extend({ required: { message: "Password is required.", 
                        params: true,
                        onlyIf: function () { return model.IsCredentialsRequired(); }}
                    });


model.ConfirmPassword = ko.observable().
                        extend({ validation: { validator: mustEqual,
                        message: 'Passwords do not match.',
                        params: model.Password,               
                        onlyIf: function () { return model.IsCredentialsRequired(); } }
                    });
Run Code Online (Sandbox Code Playgroud)

自定义验证功能的代码

var mustEqual = function (val, other) {
                return val == other();
            };
Run Code Online (Sandbox Code Playgroud)

我发现OnlyIf条件工作正常model.Password取决于 model.IsCredentialsRequired()但它不起作用model.ConfirmPassword,有人可以帮助我为什么会发生这种情况吗?有没有其他方法我可以使用条件验证自定义规则?

提前致谢

del*_*xfe 17

敲门验证目前不支持匿名规则的'onlyIf'.但它支持自定义规则.因此,您可以创建自定义规则并仅使用以下内容:

ko.validation.rules['confirmPasswordMatches'] = {
    validator: function (val, params) {
        var otherValue = params;
        return val === ko.validation.utils.getValue(otherValue);
    },
    message: 'Passwords do not match.',
};
ko.validation.registerExtenders();

function ViewModel() {
    var self = this;

    self.IsCredentialsRequired = ko.observable(true);

    self.Password = ko.observable()
        .extend({
            required: {
                message: "Password is required.",
                params: true,
                onlyIf: self.IsCredentialsRequired
            }
    });

    self.ConfirmPassword = ko.observable().
    extend({
            confirmPasswordMatches: {
            params: self.Password,
            onlyIf: self.IsCredentialsRequired
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/delixfe/mFAEx/

  • 我已经更新了答案.简而言之:淘汰验证不仅仅支持匿名规则.但它适用于定制的. (3认同)