数组不在 JSON 响应的 root-level 处的 Dojo JsonRestStore

Dojo JsonRestStore with array not at root-level of JSON response

有没有一种方法可以配置 JsonRestStore 以与 return 是一个 objects 的现有 Web 服务一起工作,该 不是 JSON 响应的 root-level?

我的 JSON 回复目前与此类似:

{
    message: "",
    success: true,
    data: [
        { name: "Bugs Bunny", id: 1 },
        { name: "Daffy Duck", id: 2 }
    ],
    total: 2
}

我需要告诉 JsonRestStore 它将找到 "data" 下的行,但我无法通过查看 documentation 找到执行此操作的方法。架构似乎是一种可能性,但我无法通过文档(或我在 Google 中找到的内容)理解它。

我的 Web 服务 return 数据采用 Ext JS 中商店所期望的格式,但我现在无法重构多年的 Web 服务(通过 HTTP headers 而不是查询处理分页字符串值可能也很有趣,但这是另一天的问题)。

谢谢。

dojo/store 的想法是提供参考存储,但它们旨在进行自定义以匹配您想要的任何数据格式。例如,https://github.com/sitepen/dojo-smore 有一些额外的商店(例如处理 Csv 数据的商店)。这些存储为如何处理在不同结构下提供的数据提供了很好的示例。

还有新的 dstore 项目 http://dstorejs.io/ ,它最终将取代 Dojo 2 中的 dojo/store,但现在针对 Dojo 1.x。这可能更容易创建自定义商店以匹配您的数据结构。

虽然它在 API 文档中几乎没有被调用,但在 dojox/data/JsonRestStore 中有一个名为 _processResults 的内部方法恰好可以很容易地覆盖用于此目的。它接收服务 returned 的数据和来自请求的原始 Deferred,并预期 return 一个包含 itemstotalCount.

的对象

根据您上面的数据,类似这样的方法应该有效:

var CustomRestStore = declare(JsonRestStore, {
    _processResults: function (results) {
        return {
            items: results.data,
            totalCount: results.total
        };
    }
});