Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 自动刷新dgrid内容_Javascript_Dojo_Dgrid - Fatal编程技术网

Javascript 自动刷新dgrid内容

Javascript 自动刷新dgrid内容,javascript,dojo,dgrid,Javascript,Dojo,Dgrid,我使用dgridOnDemandGrid来显示来自DojoJsonRest存储的数据。这很好,但我希望网格自动显示更改的数据。实现一种基于推送的方法,其中服务器告诉所有客户端哪些数据已更改,这太费劲了,因此我正在寻找一种基于客户端的解决方案。使用dgrid的refresh()是没有用的,因为这会导致闪烁并重置整个网格 到目前为止,我的最佳猜测是定期从第二个存储实例获取所有数据,将其与实时存储实例进行比较,并使用Observablestore包装器通知网格任何更改的数据 有更好、更优雅的解决方案吗

我使用dgrid
OnDemandGrid
来显示来自Dojo
JsonRest
存储的数据。这很好,但我希望网格自动显示更改的数据。实现一种基于推送的方法,其中服务器告诉所有客户端哪些数据已更改,这太费劲了,因此我正在寻找一种基于客户端的解决方案。使用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()至于项目级别差异。。。我不需要你的支持。我很想知道你是否找到了更好的解决方案,或者你是否仍在使用可观察的黑客。我目前正在努力解决同样的问题。是的,我已经解决了,请查看我的新答案以了解详细信息。谢谢!不幸的是,我确实有数百万条记录(至少接近这个数量级),但这给了我一些想法(我的数据从不改变,只在一端增长)。