0

我正在使用 REST 适配器,当我调用App.Message.find()Ember.js 时调用/messages以检索所有消息并期望看到如下 JSON 结构:

{
    "messages": [] // array contains objects
}

但是 API 我必须始终使用响应:

{
    "data": [] // array contains objects
}

我只找到了更改API 的命名空间或 URL的方式 1。如何告诉 REST 适配器寻找data而不是messages属性?

如果这是不可能的,如何解决这个问题?CTO 说我们可以根据需要调整 API 以与 REST 适配器一起使用,但由于某种原因,我们无法更改data每个响应上的这个属性。

4

1 回答 1

1

假设您可以编写自己的适配器来处理差异,在成功回调中,您可以简单地将传入的名称从“数据”修改为您的特定实体 - 在上述“消息”的情况下

我这样做是为了让您了解自定义适配器中的可能情况

在下面的链接中,我突出显示了我的 findMany 的返回行

从我的 REST api 返回的 json 看起来像

[
    {
        "id": 1,
        "score": 2,
        "feedback": "abc",
        "session": 1
    },
    {
        "id": 2,
        "score": 4,
        "feedback": "def",
        "session": 1
    }
]

我需要在 ember-data 让它看起来像这样之前对其进行转换

{
    "sessions": [
        {
            "id": 1,
            "score": 2,
            "feedback": "abc",
            "session": 1
        },
        {
            "id": 2,
            "score": 4,
            "feedback": "def",
            "session": 1
        }
    ]
}

https://github.com/toranb/ember-data-django-rest-adapter/blob/master/packages/ember-data-django-rest-adapter/lib/adapter.js#L56-57

findMany: function(store, type, ids, parent) {
    var json = {}
    , adapter = this
    , root = this.rootForType(type)
    , plural = this.pluralize(root)
    , ids = this.serializeIds(ids)
    , url = this.buildFindManyUrlWithParent(store, type, ids, parent);

    return this.ajax(url, "GET", {
      data: {ids: ids}
    }).then(function(pre_json) {
      json[plural] = pre_json; //change the JSON before ember-data gets it
      adapter.didFindMany(store, type, json);
    }).then(null, rejectionHandler);
},
于 2013-06-02T22:17:44.413 回答