从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
中使用或等同于单一记录?有什么建议吗?
答案 0 :(得分:8)
.findAll
:
首次调用store.find,获取新数据
下次返回缓存数据
在后台获取新数据并更新
这是新findRecord和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
,但我们鼓励您在所有地方使用.findAll
,因为它已缓存并适合多个数据请求(来自应用程序的多个地方而不会浪费)带宽)。
例如,用户输入我的博客,然后我获得所有帖子 使用findAll,然后在同一流程中的某个点我需要所有这些 发布,所以我应该使用peekAll来节省带宽。那我该怎么办? 知道我以前要求所有帖子吗?我可以节省一些吗? 全球国家处理那个?我会假设第一次 如果没有任何记录,客户请求一个peekAll 自动做一个findAll或者我应该手动但它 可能会介绍一些样板。
我认为用户需要在您的应用程序中始终拥有最新数据。如果您在浏览页面时添加博客帖子怎么办?如果您使用.peekAll()
,则用户需要刷新页面才能获取最新数据。
如果您想节省带宽,那么我建议您在Ember Adapter中实现某种额外的逻辑,但您必须找到平衡用户请求的方法,并且需要始终提供最新数据。您可以通过覆盖Adapter的方法来完成此操作:
shouldReloadAll: function(store, snapshotRecordArray)
shouldBackgroundReloadAll: function(store, snapshotRecordArray)
请参阅more info about these methods in Ember API docs。
你如何在实践中使用findAll和peekAll或他们的等价物 单曲?有什么建议吗?
如果您完全确定在第一次请求后始终拥有最新数据,请使用.peekAll
。数据可以始终是最新的,因为,例如,它几乎不会在数据库中发生变化。这取决于您的需求以及您如何设计数据模型。很难找到好的例子,但也许想象一下你是否会有一些只包含常数的模型。像PI
值等。也许你已经从某个地方导入了它,它是完整的,封闭的一组永远不会改变的东西。然后,在第一个.findAll
之后,(例如,如果它是您的应用程序的核心功能,它可以在Application
路由beforeModel
挂钩中定义),您将确保不再需要更多请求拥有所有数据。
如果您的应用程序有类似离线模式的东西,并且只能依赖您已有的数据,您也可以使用.peekAll
。