1

我在玩淘汰赛 js 时玩得很开心,并且刚刚开始掌握添加自定义 bindingHandlers 的方法。

我在使用第 3 方 jqWidget 仪表的更新功能时遇到了一些困难——我只能在第一次更新变量时让它动画化。在之后的每次更新中,它只是直接设置值。

我不完全理解 ko.utils.registerEventHandler() 以及它的作用,尽管我已经在许多其他示例中看到了它。这是导致动画中断的原因吗?我如何知道要从 3rd 方小部件注册哪些事件?

出于某种原因,如果我添加一个也绑定到 observable 的 jquery ui 滑块,这可以正常工作。

您可以在此处进行测试:设置该值几次以查看它第一次而不是之后的动画。

http://jsfiddle.net/LkqTU/4531/

4

2 回答 2

2

当您更新输入字段时,您的 observable 最终将成为一个字符串。看起来仪表不喜欢用字符串值更新,至少在第一次之后。

因此,如果您确保使用数字(parseIntparseFloat或仅+视情况而定)对其进行更新,那么它似乎可以正常更新。

就像是:

update: function(element, valueAccessor) {
    var gaugeval = parseInt(ko.utils.unwrapObservable(valueAccessor()), 10);   
    $(element).jqxGauge('value', gaugeval || 0);
}

http://jsfiddle.net/rniemeyer/LkqTU/4532/

您通常只会在这样的场景中注册事件处理程序,以响应您想要更新视图模型数据的用户所做的更改。例如,如果用户可以通过单击仪表来更改值,那么您将希望处理该事件并相应地更新您的视图模型值。

于 2012-10-16T15:36:44.743 回答
1

我在回答

我不完全理解 ko.utils.registerEventHandler() 及其作用

你问题的一部分。

registerEventHandler将以跨浏览器兼容的方式注册您的事件处理函数。如果您使用 jQuery,Knockout 将使用 jQuery 的bind函数来注册事件处理程序。否则,将使用具有跨浏览器的一致行为的浏览器 Web API。

您可以在源代码上查看它。

于 2015-03-27T17:19:09.057 回答