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的主要内容,如果未能解决你的问题,请参考以下文章

JSON with C program

XML和JSO的面试题(修订版)

在javascript中循环遍历python-dictionary-turned-into-json

javascript的JSON对象

Google-cloud-dataflow:无法通过带有“BigQueryDisposition.WRITE_TRUNCATE”的“WriteToBigQuery/BigQuerySink”将 jso

PSP2000怎么看小说?请详细解说