【问题标题】:custom validation rule is not triggered未触发自定义验证规则
【发布时间】:2014-03-17 23:57:43
【问题描述】:

我正在使用来自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 函数中: 验证器:函数(val,otherField){ 调试器 返回 val === this.getValue(otherField); }, 但是流程从未访问过这一点。有什么问题?

编辑:

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

【问题讨论】:

  • 您是否致电ko.validation.registerExtenders() 注册您的自定义规则?
  • 不,我没有这样做,因为我不知道我需要这样做:)。请将其作为答案发布,就像我这样做时触发了验证一样

标签: knockout.js knockout-validation


【解决方案1】:

虽然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();

为了使用您的自定义规则,您不需要“参数语法”,因此您可以编写:

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

【讨论】:

  • 谢谢!标记为答案。这是题外话,但您能告诉我如何使用自定义规则进行本地化吗?
  • 好问题,我从来没有使用过插件的本地化功能,所以我不知道。但是写ko.validation.localize({ areSame: 'Your localized error message.'}); 之类的东西在理论上应该可行。当然你需要在ko.validation.rules['areSame']之后添加这个。
  • 谢谢你的建议,我试试。另请参阅我更新的问题 - 现在触发了验证,但它没有按预期工作
猜你喜欢
  • 2012-07-07
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多