你如何在实践中使用findAll和peekAll在Ember?

Jav*_*diz 4 ember.js ember-data

EmberJS文档中,我得到以下两种方法来检索给定类型的所有记录,一个是发出请求而另一个不是.

var posts = this.store.findAll('post'); // => GET /posts

var posts = this.store.peekAll('post'); // => no network request

在我看来,我总是需要先做一个,findAll但我不明白我应该什么时候做peekAll.

例如,用户进入我的博客然后我得到所有的帖子使用findAll,然后在同一流程中的某些点我需要所有这些帖子,所以我应该使用a peekAll来节省带宽.所以我怎么知道我以前要求所有的posts?我应该保存一些全球状态来处理吗?我会假设第一次客户端请求a peekAll如果没有任何记录它会自动执行findAll或者我应该手动但它可能会引入一些样板.

如何在实践中运用findAllpeekAll或者等价物单记录?有什么建议?

Dan*_*mak 8

.findAll 缓存:

第一次调用store.find,获取新数据

下次返回缓存数据

在后台获取新数据并进行更新

这是新的findRecord和findAll方法的行为.

正如您可以阅读Ember Data v1.13博客文章.

所以,举个例子:

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
Run Code Online (Sandbox Code Playgroud)

和:

在我看来,我总是需要先做一个findAll但是我不明白我何时应该偷看所有.

是的,您需要先做.findAll,但我们鼓励您.findAll在所有地方使用,因为它被缓存并适合多个数据请求(来自应用程序的许多地方而不浪费带宽).

例如,用户进入我的博客然后我使用findAll获取所有帖子,然后在同一流程中的某个时刻我需要所有这些帖子,所以我应该使用peekAll来节省带宽.那我怎么知道我以前要求所有帖子?我应该保存一些全球状态来处理吗?我假设第一次客户端请求peekAll如果没有任何记录它将自动执行findAll或者我应该手动但它可能会引入一些样板.

我认为用户需要在您的应用程序中始终拥有最新数据.如果您在浏览页面时添加博客帖子怎么办?如果你愿意,.peekAll()那么用户需要刷新页面才能获得最新数据.

如果您想节省带宽,那么我建议您在Ember Adapter中实现某种额外的逻辑,但您必须找到平衡用户请求的方法,并始终需要始终提供最新数据.您可以通过覆盖Adapter的方法来完成此操作:

shouldReloadAll: function(store, snapshotRecordArray)
shouldBackgroundReloadAll: function(store, snapshotRecordArray)
Run Code Online (Sandbox Code Playgroud)

在Ember API文档中查看有关这些方法的更多信息.

你如何在实践中使用findAll和peekAll或他们等同于单一记录?有什么建议?

如果您完全确定在第一次请求后始终拥有最新数据,那么请使用.peekAll.数据可以始终是最新的,因为,例如,它几乎不会在数据库中发生变化.这取决于您的需求以及您如何设计数据模型.很难找到好的例子,但也许想象一下你是否会有一些只包含常数的模型.喜欢PI价值等等.也许你已经从某个地方导入了它,它是完整的,封闭的一组永远不会改变的东西.然后,在第一次.findAll之后(例如,如果它是您的应用程序的核心功能,它可以在Application路由beforeModel挂钩中定义),您将确保不再需要更多请求并且您拥有所有数据.

您也可以使用,.peekAll如果您的应用程序具有类似离线模式的东西,并且只能依赖您已有的数据.

  • 出类拔萃,我缺少的部分是:"或从缓存中加载并在后台更新数据".这很有道理.谢谢 (2认同)