从 EmberJS documentation 我得到以下两种方法来检索给定类型的所有记录,一种发出请求,另一种不发出请求。var posts = this.store.findAll('post'); // => GET /posts
var posts = this.store.peekAll('post'); // => no network request
在我看来,我总是需要先做一个 findAll
,但我不清楚什么时候应该做 peekAll
。
例如,用户进入我的博客,然后我使用 findAll
获取所有帖子,然后在同一流程中的某个时刻我需要所有这些帖子,因此我应该使用 peekAll
来节省带宽。那么我怎么知道我之前已经请求了所有 posts
呢?我应该保存一些全局状态来处理吗?
我会假设客户端第一次请求 peekAll
如果没有任何记录它会自动执行 findAll
或者我应该手动但它可能会引入一些样板。
您如何在实践中使用 findAll
和 peekAll
或它们的等效单条记录?有什么建议吗?
最佳答案
.findAll
被缓存:
正如您在 Ember Data v1.13 blog post 中所读到的那样。
所以,以你的为例:
var posts = this.store.findAll('post'); // => GET /posts
// /\ or load from cache and update data in background /\
var posts = this.store.peekAll('post'); // => no network request
和:
是的,您需要先执行
.findAll
,但鼓励您在所有地方使用 .findAll
,因为它被缓存并适用于对数据的多个请求(来自应用程序的许多地方,而不会浪费带宽)。我认为用户需要在您的应用程序中始终保持最新数据。如果您在他浏览页面时添加博客文章怎么办?如果您使用
.peekAll()
,则用户需要刷新页面以获取最新数据。如果您想节省带宽,那么我建议您在 Ember Adapter 中实现某种额外的逻辑,但是您必须找到平衡用户请求与始终提供最新数据的需求的方法。您可以通过覆盖 Adapter 的方法来做到这一点:
shouldReloadAll: function(store, snapshotRecordArray)
shouldBackgroundReloadAll: function(store, snapshotRecordArray)
见 more info about these methods in Ember API docs 。
如果您完全确定在第一次请求后始终拥有最新数据,请使用
.peekAll
。有数据可以始终是最新的,因为例如它几乎不会在您的数据库中发生变化。然而,这取决于您的需求以及您如何设计数据模型。很难找到好的例子,但可以想象一下,如果你有一些只包含常量的模型。像 PI
值等。也许你从某个地方导入了它,它是完整的、封闭的一组永远不会改变的东西。然后,在第一个 .findAll
之后,(例如,如果它是您的应用程序的核心功能,则可以在 Application
路由 beforeModel
Hook 中定义)您将确保不再需要请求并且您拥有所有数据。如果您的应用程序具有离线模式之类的功能并且只能依赖您已有的数据,您也可以使用
.peekAll
。关于ember.js - 你如何在 Ember 中实际使用 findAll 和 peekAll?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32359545/