Ember.js和API分页

时间:2013-12-03 20:19:30

标签: ember.js model pagination promise

我正在使用Ember.js(v1.2.0)和一个返回分页JSON数据的API,如下所示:

{
    "count": 5, 
    "next": "http://127.0.0.1:8000/some/resource/?page=2", 
    "previous": null, 
    "results": [
        {
            "id": 37, 
            "title": "Some title", 
            "description": "Some description", 
        }, 
        {
            "id": 35, 
            "title": "Sdflskdf", 
            "description": "sdfkdsjf", 
        }, 
        {
            "id": 34, 
            "title": "Some other title", 
            "description": "Dsdlfksdf", 
        }, 
    ]
}

使用ember-data,所以我使用普通的ember对象作为我的模型并加载这样的数据:

App.SomeResource = Ember.Object.extend({});

App.SomeResource.reopenClass({
    find: function () {
        return $.getJSON('/some/resource/').then(function (response) {
            return response.results.map(function (data) {
                return App.SomeResource.create(data);
            });
        });
    },
});

我的model类上的find方法返回一个promise,它解析为一个对象数组。在创建SomeResource对象时,所有分页数据都将丢失。

当承诺结算时,有没有办法在某处存储countnextprevious页面网址?

2 个答案:

答案 0 :(得分:0)

我将它们分配给全局对象,但你应该做得更好。

App.SomeResource = Ember.Object.extend({});

App.SomeResource.reopenClass({
    find: function () {
        return $.getJSON('/some/resource/').then(function (response) {
            return RSVP.all(response.results.map(function (data) {
                return App.SomeResource.create(data);
            })).then(function(createdResources) {
                window.count = response.count;
                window.next = response.next;
                window.previous = response.previous;
                return createdResources;
            });
        });
    }
});

答案 1 :(得分:0)

我没有将这些元数据存储在全局window对象上,而是想出了这个:

App.SomeResource.reopenClass({
    find: function () {
        var url = '/some/resource/';
        return Ember.$.getJSON(url).then(function (response) {
            response.results = response.results.map(function (resource) {
                return App.SomeResource.create(resource);
            });
            return response;
        });
    },
});

SomeResource.find()只是从结果数组中实例化Ember对象,然后返回响应,其余数据不变。然后路线接收响应,并在setupController函数中设置分页数据

App.SomeResourceRoute = Ember.Route.extend({
    model: function () {
        return App.SomeResource.find();
    },

    setupController: function(controller, model) {
        controller.setProperties({count: model.count,
                                  pageCount: model.page_count,
                                  currentPage: model.current_page,
                                  pageRange: model.page_range,
                                  previous: model.previous,
                                  next: model.next,
                                  model: model.results,});
    },
});

它有效,但也许有更好的方法。