从具有多个可观察属性的对象获取一个通知

时间:2012-12-21 15:36:05

标签: knockout.js knockout-mapping-plugin

我正在使用淘汰赛mapping plugin为我自动创建我的观看次数,而且他们的工作正常。

但是,我正在使用Raphael.js根据我的映射对象中的值生成一个量表,但我注意到,对于每个已更新的可观察量,都会重新绘制量表。鉴于页面上有大量的这些仪表,每次从AJAX调用中获取新数据时每次重新绘制它们都不是很好。

所以,我在映射选项中使用copy将对象的所有属性都更改为普通的javascript属性。

现在的问题是,在所有直接的javascript属性都已更新之前,一个observable属性正在更新,因此测量仪的某些部分不同步。具体来说,observable属性是DisplayValue,我在量表的中间输出文本,而我也有一个正常属性PercentValue,我用它来实际绘制量规上的线。所以DisplayValue在PercentValue之前更新,这会导致仪表被重新绘制,这意味着仪表上的线总是显示最后一个PercentValue,而不是当前的那个。

我看过throttle extender,似乎我必须添加一个包含我的observables的计算属性才能使用,但我不喜欢这样做的想法添加属性只是为了获得此功能。同样,我假设我可以添加一个可观察的属性(例如LastUpdated)并在整个对象更新后手动更新,但这也感觉不尽如人意。

combinedObservable似乎确实存在问题,所以我想目前无法以我喜欢的方式做到这一点。

那么,有没有更好的方法完全做到这一点?有没有办法让正常的javascript属性在observable之前更新?我猜这些属性是按字母顺序处理的?

1 个答案:

答案 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已更新,这可能是最好的选择。