不会触发自定义验证规则

时间:2014-03-17 13:37:25

标签: knockout.js knockout-validation

我使用here中的areSame规则:

ko.validation.rules['areSame'] = {
    getValue: function (o) {
        return (typeof o === 'function' ? o() : o);
    },
    validator: function (val, otherField) {
        return val === this.getValue(otherField);
    },
    message: 'The fields must have the same value'
};

并像这样应用:

this.confirm = ko.observable().extend({
    areSame: {
       params:this.password
    }
});

但它甚至从未触发过。我将调试器放入规则定义的validator函数中:         验证器:function(val,otherField){             调试器             return val === this.getValue(otherField);         }, 然而,流程从未到过这一点。可能有什么不对?

修改

通过调用ko.validation.registerExtenders();解决了不触发验证的问题,但规则并未按预期工作。问题是传递给otherField的{​​{1}}变量是对象 validator,正如您从源代码中看到的那样,方法{params:*observable here*}并不期望这样。所以要么源代码错了,要么以错误的方式为规则定义了参数。那么哪一个?

1 个答案:

答案 0 :(得分:8)

虽然Wiki中没有明确说明(它在示例代码中,但在说明中没有),但是

您需要致电ko.validation.registerExtenders()

在您定义自定义规则以进行注册后

ko.validation.rules['areSame'] = {
    getValue: function (o) {
        return (typeof o === 'function' ? o() : o);
    },
    validator: function (val, otherField) {
        return val === this.getValue(otherField);
    },
    message: 'The fields must have the same value'
};

ko.validation.registerExtenders();

为了使用您的自定义规则,您不需要" params语法"所以你可以写:

this.confirm = ko.observable().extend({
    areSame: this.password
});

如果你想使用" params语法"您需要提供自定义错误message属性,否则插件无法正确解释otherField参数:

this.confirm = ko.observable().extend({
    areSame: {
       params: this.password,
       message: 'a custom error message'
    }
});
相关问题