dojo.store.Observable、JSON REST 和 queryEngine

dojo.store.Observable, JSON REST and queryEngine

提问人:Merc 提问时间:11/23/2012 更新时间:1/24/2013 访问量:2702

问:

有没有人知道如何在 dojo 中使用 JsonRest 存储,就像 dojo.store.Observable 中的那个一样?

在服务器端,我需要什么来实现存储并使其作为可观察的存储工作?客户端呢? 文件说 http://dojotoolkit.org/reference-guide/1.7/dojo/store/Observable.html

如果您使用的是服务器端存储(如 JsonRest 存储),则需要提供 queryEngine,以便从查询中正确包含或排除更新对象。如果 queryEngine 不可用,则将使用未定义的索引调用观察侦听器。

但是,我不知道他们是什么意思。我自己从未创建过商店,也不是 100% 熟悉 queryEngine(老实说,我觉得它有点混乱)。为什么需要 queryEngine?文档中所说的“未定义索引”是什么意思?如何为 JsonRest 存储编写 queryEngine?我不应该为可观察的REST存储使用某种Web套接字吗,因为其他用户也可能更改数据?

困惑!

JavaScript AJAX Dojo 数据存储 RESTFUL-架构

评论


答:

4赞 Rustavore 1/24/2013 #1

我意识到这个问题有点旧,但这里有一些信息供将来参考。由于这是一个由多个部分组成的问题,我将把它分解成单独的部分:

1) JsonRest 的服务器端实现

有一篇关于实现 JsonRest Store 服务器端的文章相当不错。它准确地显示了 JsonRest 将生成哪些标头以及其余部分将包含哪些内容。它有助于形成如何将 JsonRest API 转换为 HTTP 的心智模型。

2) 查询引擎

在同一页的前面,解释了 query() 在客户端的工作方式。基本上,该函数需要能够接收对象文本(例如:)并返回存储中与这些条件匹配的对象。“在存储中”意味着已经加载到客户端的内存中,而不是服务器上。query(){title:'Learning Dojo',categoryid:5}

根据您尝试执行的操作,可能不需要编写自己的 queryEngine - 如果您正在构建自己的自定义存储,只需使用内置的 SimpleQueryEngine。引擎只需要递给一个对象文字,它就会为你添加整个 dojo query() api。

3) 可观察对象

我的理解是,Observables 监控对象集合中的客户端更改(例如:添加或删除结果)甚至特定对象(例如:帖子 5 更改了标题)。它不监视服务器端发生的更改。它只是提供了一种机制来通知客户端应用的其他方面数据已更改,以便页面的所有方面保持同步。

在“集合数据绑定”和“对象数据绑定:dojo/有状态”的标题下,有一篇关于使用 Observables 的整篇文章。

4) 并发性

为了使客户端数据与服务器端数据保持同步,您需要做两件事:a) 轮询服务器上其他用户的更改,b) 使用事务将数据发送到服务器。

a) 若要轮询对数据的更改,需要让对象存储跟踪变量中的活动查询。然后,每隔一段时间在后台再次使用 或 运行查询。确保小组件或应用程序的其他方面使用 Observable 来监视它们所依赖的查询结果集中的更改。这样,其他用户在服务器上所做的更改将自动反映在整个应用程序中。setTimeout()setInterval()

b) Use transactions to combine actions that must be combined. Then, make sure the server sends back HTTP 200 Status codes (meaning 'It Worked!'). If the transactions returns a HTTP status in the 400s, then it didn't work for some reason, and you need to requery the data because something changed on the backend. For example, the record you want to update was deleted, so you can't update it. There's a write up on transactions as well under the heading 'Transactional'

评论

0赞 Merc 4/22/2014
I accepted this answer for complete-ness. However, if you want to observe JsonRest stores, you will need to write your own Observable library. That's what I did with this: [JsonObservable.js]( github.com/mercmobily/hotplate/blob/master/node_modules/…) Please note that I am in touch with the Dojo maintainer in order to render JsonObservable somehow obsolete (which is what I hope will happen)