【问题标题】:Does knockout-validation interfere with custom extenders?淘汰赛验证会干扰自定义扩展程序吗?
【发布时间】:2014-02-28 22:46:02
【问题描述】:

我正在使用 KnockoutJS 2.2.1 和 Knockout-Validation。 验证和创建自定义扩展程序之间是否存在干扰的已知错误?

因为不知何故我无法添加我的自定义扩展程序。 当我尝试运行此代码时:

self.from = ko.observable(new Date()).extend({ reportDate: { timeZoneValue: self.timeZoneValue} });

reportDate 是我的扩展器,淘汰赛验证似乎有问题,他找不到“未定义的规则”

未捕获的类型错误:无法读取未定义的属性“规则”

有人遇到过这个问题吗?如何解决?

这是reportDate扩展器的代码:

ko.extenders.reportDate = function (target, options) {
var lastValidValue = new Date();

target.subscribe(function (newValue) {
    if (newValue == null) {
        target(lastValidValue);
    } else {
        lastValidValue = newValue;
    }
    var isoDate = moment(DateProvider.adjustDateFromTimeZoneToUtc(target(), options.timeZoneValue())).toISOString();
    target.ISODateString = isoDate;
});

};

我还想知道淘汰赛验证的自定义规则是否会破坏这里的某些东西。特别是 registerExtenders() 函数,我不清楚它的作用。

$(function () {
ko.validation.init({
    insertMessages: true,
    decorateElement: true,
    errorElementClass: "error",
    errorMessageClass: "validation-message",
    grouping: { observable: true, deep: true }
});

ko.validation.registerExtenders();

});

【问题讨论】:

  • 通常扩展器应该并排工作,但这取决于您的自定义扩展器实现,所以您能否发布您的reportDate 代码?同样在您的示例中,我看不到您在哪里/如何使用 ko.validaiton,所以您还可以扩展您的示例以显示您如何使用验证插件吗? jsfiddle repro 将是帮助您解决问题的最理想选择......
  • 我添加了更多细节

标签: validation knockout.js knockout-validation


【解决方案1】:

问题是你的扩展器没有返回任何可观察的。来自the documentation on extending observables

然后它可以返回 observable 或返回新的东西 就像一个以某种方式使用原始 observable 的计算 observable。

所以你应该在扩展器中添加以下行作为最后一行代码(除非你想返回一个不同的可观察对象,在这种情况下你当然应该这样做):

return target;

【讨论】:

  • 非常感谢您!我什至想知道是否有必要返回我的目标 observable,但对我来说还不够清楚,你必须返回它。淘汰赛验证更误导了我。
  • @TomaszSikora 您需要从方法调用中返回 observable 的原因是,下一个添加的扩展程序将从扩展程序接收返回值target。因此,如果您不返回任何对象,则目标将是未定义的,从而导致您看到的错误。另外,我相信 extend 方法最终会返回最后一个扩展器的返回值。
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 2013-07-01
  • 2015-04-05
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2012-02-18
相关资源
最近更新 更多