3

我正在使用 dgridOnDemandGrid显示来自 DojoJsonRest商店的数据。这很好用,但我希望网格自动显示更改的数据。实施基于推送的方法,服务器告诉所有客户端哪些数据已更改,因此我正在寻找基于客户端的解决方案。使用 dgridrefresh()没有用,因为这会导致闪烁并重置整个网格。

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

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

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

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

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

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

4

2 回答 2

1

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

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

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

于 2012-08-01T09:04:48.120 回答
0

经过几个小时的思考,我找到了一个更好的解决问题的方法:我创建了一个缓存存储,它最初以所有数据库记录为种子(因此,如果您实际上有数百万条记录,这可能无法扩展)。这个缓存存储被包装在一个 Observable 存储中,并通过轮询服务器的更改来更新(使用带有 Redis 后端的普通 HTTP,没有什么像 WebSockets 或 Comet 这样的花哨的东西)。

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

于 2013-02-21T10:20:32.563 回答