如何对ember-data关系进行分页

时间:2013-11-27 14:47:21

标签: ember.js ember-data

如何对相关数据的请求进行分页?例如,如果我的人员有一千个任务模型,如果我执行以下操作,那么在RESTful思考中,我会得到所有这些模型。

var tasks = person.get('tasks');

这将是太多的数据。如何强制一些查询参数到幕后工作的请求?理想情况下,端点上有这样的东西附加到它的末尾。

?&offset=3&limit=3

以下是fiddle来说明我在IndexController中要完成的工作。我不知道使用ember-data执行分页请求的“余烬方式”是什么。

3 个答案:

答案 0 :(得分:10)

在第一次提出这个问题时它并不存在,但现在有一个名为 ember-data-has-many-query 的插件似乎能够做到这一点,至少在RESTAdapterJSONAPIAdapter。由于余烬数据尚未支持作为一流概念的分页,它似乎有一些怪癖。如果这让您感到不安,则总是store.query,但这确实需要您的API支持(在您的示例中)person_id端点上的/tasks过滤器参数。

相关:

(这个问题看起来不像JSON API,但讨论是相关的)

答案 1 :(得分:5)

今天仍然没有默认方式来处理ember中的分页。

首先,我们应该看看更简单的事情,findAll请求的分页。

这可以通过.query({page:3})之类的方式完成,但会导致一些问题:

  1. 这是经典分页的一个很好的解决方案,但对于无限滚动,您仍然需要手动合并结果。
  2. 结果不会被缓存,因此在分页列表中前进和后退会导致大量查询。如果列表是可编辑的,有时这是必要的,但通常不是。
  3. 对于第二个问题,我构建了一个挂钩到商店的小addon called ember-query-cache,并允许您缓存查询结果。有一个非常简短的演示here

    现在,如果我们谈论一段关系,我会诚实地建议您使用顶级.query,直到您从ember-data本身获得更好的支持:

    store.query('task', { person: get(person, 'id'), page: 3 }
    

    没有什么不好的。你得到你的结果,并在另一个方向上建立关系。只要你不需要缓存,它就可以毫不犹豫地进入任何数据,如果你需要缓存,那么我需要在我的插件中完成很少的黑客操作。

    我们仍然希望ember-data完全成为JSONAPI,这需要分页。我认为从API角度来看,最好的办法是能够在关系返回的ManyArray上请求下一页和上一页。它将与JSONAPI一起提供下一个和上一个链接。但要说明一下,现在你必须深入挖掘ember-data,而不是在我在许多项目中成功使用的顶级.query进行大的改进。

答案 2 :(得分:-2)

Ember.js guides on using models,您还可以提交查询以及find()来电。

this.store.find('person', { name: "Peter" }).then(function(people) {
  console.log("Found " + people.get('length') + " people named Peter.");
});

从指南中:

  

传递给find()的搜索选项的哈希值对Ember是不透明的   数据。默认情况下,这些选项将作为发送到您的服务器   HTTP GET请求的正文。

     

使用此功能要求您的服务器知道如何解释   查询回复。