使用ember-data RESTAdapter返回分页数据的正确模式?

时间:2013-01-16 04:12:19

标签: pagination ember.js ember-data

我正在显示使用Ember Data RESTAdapter获取的页面中的文章列表。我需要实现一个bootstrap'esque paginator(参见:http://twitter.github.com/bootstrap/components.html#pagination),并且似乎找不到一个合理的模式来返回一个请求中返回分页数据,如页数,文章数,当前页面。

例如,我希望API返回类似的内容:

{
  articles: [{...}, {...}],
  page: 3,
  article_count: 4525,
  per_page: 20
}

一个想法是添加App.Paginator DS.Model,以便响应看起来像:

{
  articles: [{...}, {...}],
  paginator: {
    page: 3,
    article_count: 4525,
    per_page: 20
  }
}
但是,对于一些如此微不足道的东西来说,这似乎有些过分。有没有人解决过这个问题或者找到了他们喜欢的特定模式?是否有一种简单的方法来管理RESTAdapter映射以解决此类情况?

2 个答案:

答案 0 :(得分:4)

尝试使用Ember Pagination Support Mixin并提供您自己的以下方法的实现。您可以在用户导航页面时获取所需内容,而不是加载所有内容。您最初需要的只是您记录的总帐户。

didRequestRange: function(rangeStart, rangeStop) {
    var content = this.get('fullContent').slice(rangeStart, rangeStop);
    this.replace(0, this.get('length'), content);
  }

答案 1 :(得分:3)

使用ember-data-beta3,您可以在结果中传递meta - 属性。默认的RESTSerializer查找该属性并存储它。 您可以像这样访问元数据:

var meta = this.get("store").metadataFor("post");

如果您无法更改从服务器返回的JSON,则可以覆盖ApplicationSerializer(或任何其他特定于模型的序列化程序)上的extractMeta - 挂钩。

App.ApplicationSerializer = DS.RESTSerializer.extend({
  extractMeta: function(store, type, payload) {
    if (payload && payload.total) {
      store.metaForType(type, { total: payload.total });  // sets the metadata for "post"
      delete payload.total;  // keeps ember data from trying to parse "total" as a record
    }
  }
});

Read more about meta-data here