3

我正在使用淘汰映射插件为我自动创建我的视图,并且它们运行良好。

但是,我使用Raphael.js根据映射对象中的值生成一个仪表,但我注意到仪表会为每个更新的 observable 重新绘制。鉴于页面上有大量此类仪表,每次我从 AJAX 调用返回新数据时,将它们重新绘制 3 次对性能来说并不是很好。

因此,我已使用copy映射选项将对象上的所有属性(除了一个属性)更改为普通的 javascript 属性。

现在我遇到的问题是,在所有直接的 javascript 属性都更新之前,一个可观察的属性正在更新,因此仪表的某些部分不同步。具体来说,可观察属性是 DisplayValue,我将其作为文本输出到仪表的中间,而我还有一个普通属性 PercentValue,用于在仪表上实际绘制线条。因此 DisplayValue 在 PercentValue 之前更新,这会导致重新绘制仪表,这意味着仪表上的线始终显示最后一个 PercentValue,而不是当前的。

我查看了油门扩展器,看来我必须添加一个包含我的两个可观察对象的计算属性才能工作,但我不喜欢必须添加一个属性的想法获得此功能。同样,我假设我可以添加一个可观察属性(例如 LastUpdated)并在整个对象更新后手动更新它,但这也让人不满意。

对于combineObservable似乎确实存在一个问题,所以我想目前无法以我想要的方式执行此操作。

那么,有没有更好的方法来完全做到这一点?是否有某种方法可以在可观察对象之前更新正常的 javascript 属性?我猜这些属性是按字母顺序处理的?

4

1 回答 1

2

我主要实施了 RP 的建议,但正如他作为评论所说,我的实施方式略有不同,我想我会在这里完整回答,以防它对其他人有用。

我已经使我的仪表使用普通 JS 属性的所有属性,而不是将 DisplayValue 保留为可观察的,但我已向对象添加了一个新的可观察属性,称为更新。使用映射插件将新数据复制到现有对象后,我使用上面提到的 valueHasMutated 方法 RP。

ko.mapping.fromJS(point, existingPoint);
existingPoint.updated.valueHasMutated();

我有一个淘汰赛自定义绑定处理程序,我使用它绑定到 observable 属性

ko.utils.unwrapObservable(viewModel.updated);

现在我只触发了一个更新事件。显然,我仍然不认为这是理想的,但是除非映射插件可以选择仅在复制所有正常属性后才触发可观察对象已更新,否则这可能是最佳选择。

于 2013-01-03T11:08:50.710 回答