我意识到这个问题有点老了,但这里有一些信息供将来参考。由于这是一个多部分的问题,我将把它分成几个部分:
1)JsonRest的服务端实现
关于实现JsonRest Store 的服务器端有一篇相当不错的文章。它准确地显示了 JsonRest 将生成哪些标头以及其余部分将包含哪些内容。它有助于形成 JsonRest api 如何转换为 HTTP 的心理模型。
2) 查询引擎
在同一页面的前面,解释了 query() 如何在客户端工作。基本上,该query()
函数需要能够接收对象文字(例如:){title:'Learning Dojo',categoryid:5}
并返回存储中与这些条件匹配的对象。“在存储中”意味着已经加载到客户端的内存中,而不是服务器上。
根据您要执行的操作,可能不需要编写自己的查询引擎——如果您正在构建自己的自定义存储,只需使用内置的 SimpleQueryEngine 。引擎只需要传递一个对象字面量,它就会为您添加整个 dojo query() api。
3) 可观察的
我的理解是 Observables 监视对象集合中的客户端更改(例如:添加或删除结果)甚至在特定对象中(例如:post 5 已更改标题)。它不监视服务器端发生的更改。它只是提供一种机制来通知客户端应用程序的其他方面数据已更改,以便页面的所有方面保持同步。
在“Collection Data Binding”和“Object Data Binding: dojo/Stateful”标题下有一篇关于使用 Observables的完整文章。
4) 并发
为了使客户端数据与服务器端数据保持同步,您需要做两件事:a) 轮询服务器上其他用户的更改,b) 使用事务将数据发送到服务器。
a) 要轮询数据的更改,您需要让对象存储跟踪变量中的活动查询。然后,每隔一段时间使用setTimeout()
或setInterval()
在后台再次运行查询。确保应用程序的小部件或其他方面使用 Observables 来监控它们所依赖的查询结果集的变化。这样,其他用户对服务器的更改将自动反映在整个应用程序中。
b) 使用事务来组合必须组合的动作。然后,确保服务器发回 HTTP 200 状态代码(意思是“它成功了!”)。如果事务在 400 秒内返回 HTTP 状态,那么由于某种原因它不起作用,您需要重新查询数据,因为后端发生了一些变化。例如,您要更新的记录已被删除,因此您无法对其进行更新。在“交易”标题下也有关于交易的文章