Ember 数据:我什么时候使用 findAll() 而不是 query()?
Ember Data: When do I use findAll() over query()?
这是我发现自己 运行 的模式:
我开始制作一个应用程序,我使用 findAll()
来获取 [something random] 的列表。
一旦应用程序接受了严格的数据测试,随机资源实例的数量就会增加。我需要限制屏幕上资源实例的数量。我需要开始对它们进行分页。为此,我需要查询字符串支持。例如。 page[offset]
.
所以findAll(criteria)
被query(criteria, querystring)
代替了。
这种模式如此之多,以至于 findAll()
开始看起来像是 query()
的开发占位符,以后会用到。
我可能误解了 findAll()
的用法。 findAll()
真的不能使用分页吗(不自定义适配器代码)?有人可以解释一下在什么情况下应该使用 findAll()
吗?
我个人使用findAll
方法来获取用户无法过滤的各种下拉列表和短列表中出现的数据。我使用 query
和 queryRecord
几乎所有其他东西。
这里有一些 findAll
的特殊性可能会产生误导:
findAll
return 存储中存在的所有记录以及使用记录的适配器获取的数据。
findAll
的 return 有两个方面,首先你会收到商店的内容,然后用适配器获取的数据刷新它,这个行为可以被覆盖使用 reload
标志。
为了扩展 Jean 的答案,findAll 就是这样做的,找到所有!如果你有 "post types" 这样的实体,其中有 [广告、博客、诗歌],findall 是有意义的,因为你一直在拉这 3 件事(例如在 "post creator" 中)。
查询更精准。假设您 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 上实现。一种流行的模式是 accept/return "page" 和 "count" 属性。这些通常可以在 API 有效载荷的 "meta" 属性.
中找到
因此,如果您想查看数据库中您知道 of/have 的所有汽车:
// 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/
在那个 link 的示例中,您可以看到如何转换到路由并在商店请求中使用查询参数来获取相关数据。
简而言之,findAll() 非常适合查找易于表示的有限信息集,通常是实体类型。
query() 非常适合根据条件过滤的任何结果集,如您所述。
快乐编码:)
这是我发现自己 运行 的模式:
我开始制作一个应用程序,我使用 findAll()
来获取 [something random] 的列表。
一旦应用程序接受了严格的数据测试,随机资源实例的数量就会增加。我需要限制屏幕上资源实例的数量。我需要开始对它们进行分页。为此,我需要查询字符串支持。例如。 page[offset]
.
所以findAll(criteria)
被query(criteria, querystring)
代替了。
这种模式如此之多,以至于 findAll()
开始看起来像是 query()
的开发占位符,以后会用到。
我可能误解了 findAll()
的用法。 findAll()
真的不能使用分页吗(不自定义适配器代码)?有人可以解释一下在什么情况下应该使用 findAll()
吗?
我个人使用findAll
方法来获取用户无法过滤的各种下拉列表和短列表中出现的数据。我使用 query
和 queryRecord
几乎所有其他东西。
这里有一些 findAll
的特殊性可能会产生误导:
findAll
return 存储中存在的所有记录以及使用记录的适配器获取的数据。findAll
的 return 有两个方面,首先你会收到商店的内容,然后用适配器获取的数据刷新它,这个行为可以被覆盖使用reload
标志。
为了扩展 Jean 的答案,findAll 就是这样做的,找到所有!如果你有 "post types" 这样的实体,其中有 [广告、博客、诗歌],findall 是有意义的,因为你一直在拉这 3 件事(例如在 "post creator" 中)。
查询更精准。假设您 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 上实现。一种流行的模式是 accept/return "page" 和 "count" 属性。这些通常可以在 API 有效载荷的 "meta" 属性.
中找到因此,如果您想查看数据库中您知道 of/have 的所有汽车:
// 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/
在那个 link 的示例中,您可以看到如何转换到路由并在商店请求中使用查询参数来获取相关数据。
简而言之,findAll() 非常适合查找易于表示的有限信息集,通常是实体类型。
query() 非常适合根据条件过滤的任何结果集,如您所述。
快乐编码:)