这是我遇到的模式:
我开始制作应用,然后使用findAll()
来获取[随机内容]的列表。
一旦使用大量数据对应用程序进行了测试,随机资源实例的数量就会增加。我需要限制屏幕上的资源实例数。我需要开始对它们进行分页。为此,我需要查询字符串支持。例如。 page[offset]
。
因此findAll(criteria)
被query(criteria, querystring)
取代。
这种模式是如此之多,以至于findAll()
开始看起来像query()
的开发占位符,以后再使用。
我可能误解了findAll()
的用法。 findAll()
真的不能完全使用分页(没有自定义适配器代码)吗?有人可以解释在什么情况下应使用findAll()
吗?
答案 0 :(得分:3)
我个人使用findAll
方法来获取出现在用户无法过滤的各种下拉列表和简短列表中的数据。我将query
和queryRecord
用于其他所有功能。
findAll
的一些特殊之处可能会引起误解:
findAll
返回存储中存在的所有记录以及使用记录适配器获取的数据。findAll
的返回结果是双重的,首先您将收到存储的内容,然后将其更新为使用适配器获取的数据,可以使用{{1}覆盖此行为}标志。答案 1 :(得分:1)
要扩展吉恩的答案,findAll会那样做,找到全部!如果您拥有诸如“帖子类型”之类的实体,并且具有[广告,博客,诗歌],则findall是有意义的,因为您一直在拉这3件东西(例如在“帖子创建者”中)。
查询更为精确。假设您有一个api返回您所见过的每一辆车。 假设您有一个具有“颜色”和“车身样式”属性的“汽车”模型 您可以使用:
// find all red cars -> /cars?color=red
store.query('car', {color: 'red'});
// find all cars that are coupes -> /cars?bodyStyle=coupe
store.query('car', {bodyStyle: 'coupe'});
对于分页问题,通常在API上实现。一种流行的模式是接受/返回“页面”和“计数”属性。这些通常可以在API有效负载的“元”属性中找到。
因此,如果您想浏览数据库中已知/拥有的所有汽车,则:
// find first 10 cars -> /cars?count=10&page=1
store.query('car', {count: 10, page: 1});
// on the next page, find the next 10 cars -> /cars?count=10&page=2
store.query('car', {count: 10, page: 2});
要进一步开展自己的研究,您应该研究控制器上的查询参数绑定以减轻实施此类解决方案所需的工作量,这毫无意义。
https://guides.emberjs.com/release/routing/query-params/
在该链接的示例中,您可以看到如何过渡到路线并如何在存储请求中使用查询参数来获取相关数据。
简而言之,findAll()非常适合查找有限的易于表示的信息集,通常是实体的类型。
如前所述,query()非常适合基于条件的任何过滤结果集。
快乐编码:)