.findAll
已缓存:
第一次调用store.find,获取新数据
下次返回缓存数据
在后台获取新数据并更新
这是新的 findRecord 和 findAll 方法的行为。
正如您可以阅读的Ember Data v1.13 博客文章 http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_better-caching-defaults-for-code-findall-code-and-code-findrecord-code.
所以,以你的例子为例:
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
And:
在我看来,我总是需要先做 findAll 但不是
清楚我的理解我什么时候应该做 peekAll。
是的,你需要先做.findAll
,但我们鼓励您使用.findAll
在所有地方,因为它被缓存并适合多个数据请求(来自应用程序的许多地方,而不浪费带宽)。
例如,用户进入我的博客,然后我得到所有帖子
使用 findAll,然后在同一流程中的某个时刻我需要所有这些
发布,所以我应该使用 peekAll 来节省带宽。那我该怎么办
知道我之前已经请求了所有帖子吗?我应该保存一些吗
全局状态来处理这个?我假设第一次
如果没有任何记录,客户端会请求 peekAll
自动执行 findAll 或者也许我应该手动执行但它
可能会介绍一些样板文件。
我认为用户需要在您的应用程序中始终拥有最新的数据。如果您在他浏览页面时添加博客文章怎么办?如果你想使用.peekAll()
那么用户需要刷新页面才能获取最新数据。
如果您想节省带宽,那么我建议您在 Ember Adapter 中实现某种附加逻辑,但您必须找到方法来平衡用户请求与始终提供最新数据的需要。您可以通过重写 Adapter 的方法来做到这一点:
shouldReloadAll: function(store, snapshotRecordArray)
shouldBackgroundReloadAll: function(store, snapshotRecordArray)
See 有关这些方法的更多信息,请参阅 Ember API 文档 http://emberjs.com/api/data/classes/DS.Adapter.html#method_shouldBackgroundReloadAll.
在实践中如何使用 findAll 和 peekAll 或它们的等效项
单条记录 ?有什么推荐吗?
如果您完全确定在第一次请求后始终拥有最新数据,则使用.peekAll
。有些数据可以始终是最新的,因为例如它在数据库中几乎永远不会改变。然而,这取决于您的需求是什么以及您如何设计数据模型。很难找到好的例子,但也许想象一下,如果您有一些仅包含常量的模型。喜欢PI
值等。也许你已经从某个地方导入了它,并且它是一个完整的、封闭的集合,永远不会改变。然后,在第一个之后.findAll
,(例如,如果它是您应用程序的核心功能,则可以在中定义Application
route beforeModel
hook)您将确保不再需要任何请求并且您拥有所有数据。
你也可以使用.peekAll
如果您的应用程序具有离线模式之类的功能并且只能依赖您已有的数据。