Javascript 自动刷新dgrid内容
我使用dgridJavascript 自动刷新dgrid内容,javascript,dojo,dgrid,Javascript,Dojo,Dgrid,我使用dgridOnDemandGrid来显示来自DojoJsonRest存储的数据。这很好,但我希望网格自动显示更改的数据。实现一种基于推送的方法,其中服务器告诉所有客户端哪些数据已更改,这太费劲了,因此我正在寻找一种基于客户端的解决方案。使用dgrid的refresh()是没有用的,因为这会导致闪烁并重置整个网格 到目前为止,我的最佳猜测是定期从第二个存储实例获取所有数据,将其与实时存储实例进行比较,并使用Observablestore包装器通知网格任何更改的数据 有更好、更优雅的解决方案吗
OnDemandGrid
来显示来自DojoJsonRest
存储的数据。这很好,但我希望网格自动显示更改的数据。实现一种基于推送的方法,其中服务器告诉所有客户端哪些数据已更改,这太费劲了,因此我正在寻找一种基于客户端的解决方案。使用dgrid的refresh()
是没有用的,因为这会导致闪烁并重置整个网格
到目前为止,我的最佳猜测是定期从第二个存储实例获取所有数据,将其与实时存储实例进行比较,并使用Observable
store包装器通知网格任何更改的数据
有更好、更优雅的解决方案吗?如果没有,我如何才能做到最好
编辑:这种方法的问题是要知道网格中当前显示了哪些行。我的应用程序处理大量数据,所以在两个dojo商店中同步整个集合不是一个好主意。有没有办法知道网格中当前显示了哪些行?理想情况下,网格只需定期重新请求当前显示行的数据。不会那么难吧
edit2:到目前为止,我最好的方法是“破解”可观察的存储,跟踪所有调用observe
。然后,我会定期重新执行观察到的查询,并将更改合并到live store中。
问题是dgrid让太多的观察者保持开放状态,使其无法顺利工作。它关闭了其中一些,因此我的代码中没有错误,我将faroffremovation
设置为500(也尝试了更低和更高)
这是我目前的代码:
它还没有完成,但是它显示了足够的调试信息来显示问题所在。因为可能没有人想设置这个,而且JSFIDLE上也没有dgrid,所以我可以告诉您,在1000个条目的网格中滚动之后,大约有10-15个观察者,而observerStats.abs(至少观察一次的所有行的计数)大约为750。您可以使用一些缓存存储,只需刷新(关闭/销毁)即可周期性
因此,基本上,您需要清理CacheStore,然后重新执行查询。经过几个小时的思考,我找到了更好的解决方案:
我创建了一个缓存存储区,它最初是以所有数据库记录为种子的(因此,如果您实际上有数百万条记录,那么这可能无法扩展)。这个缓存存储被包装在一个可观察的存储中,并通过轮询服务器进行更新(使用带有Redis后端的普通HTTP,没有WebSockets或Comet那样的花哨)
代码:很抱歉,这两种方法都不起作用(store.Cache不缓存查询,只缓存单个项目),但它也没有抓住我问题的重点。哦,好吧,我很高兴能帮上忙。。。顺便说一句,我得到了解决方案,但因为我同时被否决了,我将为我保留它。玩得高兴顺便说一句,store.Cache会缓存查询,如果要使用缓存查询,必须使用store.Cache.query()而不是JsonRest.query()。不管怎样,来吧。没必要粗鲁。如果你有一个解决方案,我将非常乐意投票并接受它。遗憾的是,你又错了。Cache将所有单个项保存到缓存存储(我们称之为内存)。如果你想从缓存中获取查询,而不是单个项目,你必须使用Memory.query而不是cache.queryHey,我不是粗鲁无礼的。关于缓存的内容,在我给你的doc链接中:“Doing get()和query()调用结果被添加到缓存中(除非它们不符合提供的条件),但是只有get()使用缓存,而query()使用主存储。如果你想从缓存中得到查询,直接在缓存存储中调用query()至于项目级别差异。。。我不需要你的支持。我很想知道你是否找到了更好的解决方案,或者你是否仍在使用可观察的黑客。我目前正在努力解决同样的问题。是的,我已经解决了,请查看我的新答案以了解详细信息。谢谢!不幸的是,我确实有数百万条记录(至少接近这个数量级),但这给了我一些想法(我的数据从不改变,只在一端增长)。