我正在使用淘汰赛mapping plugin为我自动创建我的观看次数,而且他们的工作正常。
但是,我正在使用Raphael.js根据我的映射对象中的值生成一个量表,但我注意到,对于每个已更新的可观察量,都会重新绘制量表。鉴于页面上有大量的这些仪表,每次从AJAX调用中获取新数据时每次重新绘制它们都不是很好。
所以,我在映射选项中使用copy
将对象的所有属性都更改为普通的javascript属性。
现在的问题是,在所有直接的javascript属性都已更新之前,一个observable属性正在更新,因此测量仪的某些部分不同步。具体来说,observable属性是DisplayValue,我在量表的中间输出文本,而我也有一个正常属性PercentValue,我用它来实际绘制量规上的线。所以DisplayValue在PercentValue之前更新,这会导致仪表被重新绘制,这意味着仪表上的线总是显示最后一个PercentValue,而不是当前的那个。
我看过throttle extender,似乎我必须添加一个包含我的observables的计算属性才能使用,但我不喜欢这样做的想法添加属性只是为了获得此功能。同样,我假设我可以添加一个可观察的属性(例如LastUpdated)并在整个对象更新后手动更新,但这也感觉不尽如人意。
combinedObservable似乎确实存在问题,所以我想目前无法以我喜欢的方式做到这一点。
那么,有没有更好的方法完全做到这一点?有没有办法让正常的javascript属性在observable之前更新?我猜这些属性是按字母顺序处理的?
答案 0 :(得分:2)
我主要实施了RP的建议,但是他把它作为评论,并且我的实施方式略有不同,我想我会在这里完整地回答它,以防它对任何人都有用。< / p>
我已经制作了我的规范使用普通JS属性的所有属性,而不是将DisplayValue作为可观察对象,但我已经向对象添加了一个新的observable属性,称为updated。一旦我使用映射插件将新数据复制到现有对象,我就使用上面提到的valueHasMutated方法RP。
ko.mapping.fromJS(point, existingPoint);
existingPoint.updated.valueHasMutated();
我有一个淘汰赛custom binding handler,我使用
绑定到可观察的属性ko.utils.unwrapObservable(viewModel.updated);
现在我只获得了一个更新事件。显然,我仍然不认为这是理想的,但除非映射插件获得一个选项,只有在已经复制了所有正常属性时才触发observable已更新,这可能是最好的选择。