推迟更新knockoutjs模型直到验证/保存

时间:2012-05-16 17:08:44

标签: knockout.js

有没有办法为valueUpdate创建自定义事件,以便我可以 推迟更新我的模型,直到对象被验证/保存?

documentation说:

  

以下字符串值是最常用的选项:

     

“改变”......,“keyup”......,“keypress”......,“afterkeydown”......

暗示其他值是可能的,但没有说明我可能找到完整列表的位置。

我希望有一个弹出窗体(在隐藏的div中直到需要),并带有一个取消按钮,可以删除表单而不更新模型。只有在用户按下保存按钮时才能更新模型。

(我从here略微复制了这个问题 - 似乎我不是唯一一个想要这个问题的人,但他们没有答案)

2 个答案:

答案 0 :(得分:0)

可以选择从observable订阅'beforeChange'通知流。 这使您有机会在更改之前检查该值。

真正解决模型验证的最明显方法是使用“可写”计算值。 这些允许您合并验证逻辑

答案 1 :(得分:0)

与文档所暗示的相反,valueUpdate参数不“定义KO应该使用哪个浏览器事件来检测更改”,默认为“更改”,它允许您提供事件或可能的列表除了总是被捕获的“改变”之外应该捕获的事件。

相关的code是:

// Always catch "change" event; possibly other events too if asked
var eventsToCatch = ["change"];
var requestedEventsToCatch = allBindingsAccessor()["valueUpdate"];
if (requestedEventsToCatch) {
    if (typeof requestedEventsToCatch == "string") // Allow both individual event names, and arrays of event names
        requestedEventsToCatch = [requestedEventsToCatch];
    ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch);
    eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch);
}

此行为实际上是在https://github.com/SteveSanderson/knockout/issues/102中请求并强调的 https://github.com/SteveSanderson/knockout/commit/843420a6f801b17dd357880b359a67fa53647999

看起来文档尚未更新。如果他们需要,我希望人们不得不要求更改,并且文档告诉他们类似的东西:

“事件列表,我们建议包括'更改',传递[]以禁用自动更新模型”