这是我发现自己遇到的模式:
我开始制作应用程序,然后使用findAll()
获取[随机]的列表。
一旦使用严重数据测试应用程序,随机资源实例的数量将增加。我需要限制屏幕上的资源实例数量。我需要开始对它们进行分页。为此,我需要查询字符串支持。例如。 page[offset]
。
所以findAll(criteria)
被query(criteria, querystring)
取代。
这是一个模式,以至于findAll()
开始看起来像query()
的开发占位符,以后再使用。
我可能误解了findAll()
的使用。是真的findAll()
根本不能使用分页(没有自定义适配器代码)?有人可以解释在什么情况下应该使用findAll()
?
我个人使用findAll
方法来获取出现在用户无法过滤的各种下拉列表和短列表中的数据。我使用query
和queryRecord
几乎所有其他东西。
以下是findAll
的一些特殊性,可能会产生误导:
findAll
返回商店中存在的所有记录以及使用记录适配器获取的数据。findAll
的返回是双重的,首先你将收到商店的内容,然后它将使用适配器获取的数据刷新,这种行为可以使用reload
标志覆盖。为了扩展Jean的答案,findAll会这样做,找到所有!如果你有[帖子类型]等实体,你有[广告,博客,诗歌],那么findall是有道理的,因为你一直在拉这三件事(例如在“创作者”中)。
查询更精确。说你有一个api返回你见过的每辆车。假设你有一个“car”模型,其属性为“color”和“bodyStyle”你可以使用:
// 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有效负载的“meta”属性中。
因此,如果您想查看数据库中您知道/拥有的所有汽车:
// 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()非常适合基于条件的任何过滤结果集。
快乐编码:)