【问题标题】:The right pattern for returning pagination data with the ember-data RESTAdapter?使用 ember-data RESTAdapter 返回分页数据的正确模式?
【发布时间】:2012-12-30 08:23:08
【问题描述】:

我正在页面中显示使用 Ember Data RESTAdapter 获取的文章列表。我需要实现一个引导式分页器(请参阅: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 映射以解决此类情况?

【问题讨论】:

  • 我认为这还没有固定的约定。你可以看看Ember Table,看看他们是如何实现它的,因为演示显示了 500 000 条记录的无限滚动并且速度非常快。
  • Ember Table 是一种显示数据的方式,而不是如何加载它们。问题似乎集中在处理来自 API 的元数据以进行分页。我认为这个问题是相关的:goo.gl/GPnP1。但我真的不喜欢建议的解决方案..
  • @louiscoquio 这绝对不是一个漂亮的解决方案,但与我认为明显的、被黑的解决方案相差不远。我今天需要开始工作,所以我会分享结果。
  • @louiscoquio RESTSerializer 对 json 响应中的“元”属性进行了特殊处理,但正如相关问题中所指出的,它不会在任何地方公开。我将继续使用自定义序列化程序 hack,因为在不久的将来它应该很容易与更好的解决方案集成。在我看来, DS.RecordArray 应该具有特殊属性,例如包含 meta。在这种情况下,也许更好的命名约定是 DS.Result 或类似的。

标签: pagination ember.js ember-data


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多