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

时间:2015-09-02 17:27:29

标签: ember.js ember-data

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或者我应该手动但是它可能会引入一些样板。

您如何在实践findAllpeekAll中使用或等同于单一记录?有什么建议吗?

1 个答案:

答案 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