自动刷新dgrid内容

时间:2012-07-30 21:52:24

标签: javascript dojo dgrid

我正在使用dgrid OnDemandGrid来显示Dojo JsonRest商店中的数据。这很好但我希望网格自动显示更改的数据。实现基于推送的方法,其中服务器告诉所有客户哪些数据已经改变是太费力,所以我正在寻找基于客户端的解决方案。使用dgrid的refresh()没有用,因为这会导致闪烁并重置整个网格。

到目前为止,我最好的猜测是定期从第二个商店实例获取所有数据,将其与实时商店实例进行比较,并使用Observable商店包装器向网格通知任何已更改的数据。

有更好,更优雅的解决方案吗?如果没有,我该如何做到最好?

编辑:此方法的问题是要知道当前在网格中显示哪些行。我的应用程序使用大量数据,因此在两个dojo商店中同步整个集合并不是一个好主意。有没有办法告诉网格当前显示哪些行?理想情况下,网格会定期重新请求当前显示的行的数据。不能那么难,对吗?

edit2:到目前为止,我最好的方法是“破解”Observable商店,跟踪对observe的所有来电。然后我会定期重新执行观察到的查询并将更改合并到实时存储中。 问题是dgrid让太多观察者保持开放,以便顺利运作。它关闭了其中一些,因此我的代码中没有错误,我将farOffRemoval设置为500(也尝试越来越低)。

到目前为止,这是我的代码:https://gist.github.com/3225927

它已经完成但它显示了足够的调试信息以显示问题所在。因为可能没有人想要设置它并且在jsfiddle上没有dgrid,我可以告诉你,在1000个条目网格中滚动之后,大约有10-15个观察者和observerStats.abs(至少观察到所有行的计数)曾经)大约750。

2 个答案:

答案 0 :(得分:0)

您可以使用一些只需要定期刷新(关闭/销毁)的CacheStore

http://dojotoolkit.org/reference-guide/1.7/dojo/store/Cache.html

基本上,你清理CacheStore,然后重做你的查询。

答案 1 :(得分:0)

经过几个小时的思考,我发现了一个更好的解决方案: 我创建了一个缓存存储,最初使用所有数据库记录进行播种(因此,如果您实际拥有数百万条记录,则可能无法扩展)。此缓存存储包装在一个Observable存储中,并通过轮询服务器进行更改来更新(使用带有Redis后端的纯HTTP,没有像WebSockets或Comet这样的花哨)。

代码:https://gist.github.com/anonymous/5003727