dojo.store.Observable、JSON REST 和 queryEngine
Posted
技术标签:
【中文标题】dojo.store.Observable、JSON REST 和 queryEngine【英文标题】:dojo.store.Observable, JSON REST and queryEngine 【发布时间】:2012-11-11 13:45:51 【问题描述】:有谁知道如何使用 Dojo 中的 JsonRest 存储和一个 Observable weapper,比如 dojo.store.Observable 中的那个?
在服务器端,我需要什么来实现 store 并使其作为 Observable 工作?客户端呢? 文档说http://dojotoolkit.org/reference-guide/1.7/dojo/store/Observable.html
如果您使用像 JsonRest 存储这样的服务器端存储,则需要提供一个 queryEngine 以便在查询中正确包含或排除更新对象。如果查询引擎不可用,将使用未定义的索引调用观察侦听器。
但是,我不知道它们是什么意思。我自己从未创建过商店,也不是 100% 熟悉 queryEngine(老实说,我觉得这有点令人困惑)。为什么需要查询引擎?文档中的“未定义索引”是什么意思?以及如何为 JsonRest 存储编写查询引擎?我不应该为可观察的 REST 存储使用某种 Web 套接字吗,因为其他用户也可能更改数据?
困惑!
【问题讨论】:
【参考方案1】:我意识到这个问题有点老了,但这里有一些信息供将来参考。由于这是一个多部分的问题,因此我将其分解为多个部分:
1) JsonRest 的服务器端实现
关于实现server side of JsonRest Store 有一篇相当不错的文章。它准确地显示了 JsonRest 将生成哪些标头以及其余部分将包含哪些内容。它有助于形成 JsonRest api 如何转换为 HTTP 的心智模型。
2) 查询引擎
在同一页的前面,解释了how query() works client side。基本上,query()
函数需要能够接收对象字面量(例如:title:'Learning Dojo',categoryid:5
)并返回符合这些条件的对象存储中。 “在存储中”表示已经加载到客户端的内存中,而不是服务器上。
根据您要执行的操作,可能不需要编写自己的查询引擎——如果您正在构建自己的自定义存储,只需使用built-in SimpleQueryEngine。引擎只需要传递一个对象字面量,它就会为您添加整个 dojo query() api。
3) 可观察对象
我的理解是,Observables 监视客户端在对象集合中的变化(例如:添加或删除结果)甚至在特定对象中(例如:帖子 5 已更改标题)。它不监视服务器端发生的更改。它只是提供一种机制来通知客户端应用程序的其他方面数据已更改,以便页面的所有方面保持同步。
using Observables 在“集合数据绑定”和“对象数据绑定:dojo/Stateful”标题下有一整篇文章。
4) 并发
为了使客户端数据与服务器端数据保持同步,您需要做两件事:a) 轮询服务器上其他用户的更改,b) 使用事务将数据发送到服务器。
a) 要轮询数据的更改,您需要让对象存储跟踪变量中的活动查询。然后,每隔一段时间使用setTimeout()
或setInterval()
在后台再次运行查询。确保应用程序的小部件或其他方面使用 Observables 来监控它们所依赖的查询结果集的变化。这样,其他用户在服务器上所做的更改将自动反映在您的整个应用程序中。
b) 使用事务来组合必须组合的动作。然后,确保服务器发回 HTTP 200 状态代码(意思是“它成功了!”)。如果事务在 400 秒内返回 HTTP 状态,那么由于某种原因它不起作用,您需要重新查询数据,因为后端发生了一些变化。例如,您要更新的记录已被删除,因此您无法对其进行更新。在“事务性”标题下还有一个write up on transactions
【讨论】:
为了完整性,我接受了这个答案。但是,如果要观察 JsonRest 存储,则需要编写自己的 Observable 库。这就是我所做的:[JsonObservable.js](github.com/mercmobily/hotplate/blob/master/node_modules/…) 请注意,我正在与 Dojo 维护者联系,以使 JsonObservable 以某种方式过时(我希望这会发生)以上是关于dojo.store.Observable、JSON REST 和 queryEngine的主要内容,如果未能解决你的问题,请参考以下文章
在javascript中循环遍历python-dictionary-turned-into-json
Google-cloud-dataflow:无法通过带有“BigQueryDisposition.WRITE_TRUNCATE”的“WriteToBigQuery/BigQuerySink”将 jso