有没有办法为valueUpdate创建自定义事件,以便我可以 推迟更新我的模型,直到对象被验证/保存?
以下字符串值是最常用的选项:
“改变”......,“keyup”......,“keypress”......,“afterkeydown”......
暗示其他值是可能的,但没有说明我可能找到完整列表的位置。
我希望有一个弹出窗体(在隐藏的div中直到需要),并带有一个取消按钮,可以删除表单而不更新模型。只有在用户按下保存按钮时才能更新模型。
(我从here略微复制了这个问题 - 似乎我不是唯一一个想要这个问题的人,但他们没有答案)
答案 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
看起来文档尚未更新。如果他们需要,我希望人们不得不要求更改,并且文档告诉他们类似的东西:
“事件列表,我们建议包括'更改',传递[]以禁用自动更新模型”