Ember-Data .find()vs .all() - 如何控制缓存?

时间:2013-05-14 06:58:32

标签: ember.js ember-data

I was told为了不一直提出请求,可以使用.all()方法加载存储在商店中的数据。但是Ember如何处理缓存?我有几个问题。

你如何控制缓存?什么时候使用.find()和.all()。你使用.find()然后.all()吗?多久了?

.all()是否有一些到期日期,以便在一段时间后它可以发出新请求?或者它使用本地存储,以便我必须手动清除它?

假设我有一些数据,我想每周只刷一次?我该怎么办呢?现在,每次我进入或重新访问同一路线时,都会发出新请求。我怎么能避免这个?

2 个答案:

答案 0 :(得分:21)

首先回答您的评论中的问题:

  

我想知道如何在应用程序启动时加载数据(不是通过路由,因为我不必经常更新它)。是否可能

从技术上讲,这仍然是通过路由,但是当应用程序“启动”时加载数据的最佳方法是通过Application Route的模型钩子。

App.ApplicationRoute = Ember.Route.extend({
  model: function({
    return App.Post.find();
  })
})

路由器将等待find()返回的promise以解析,因此您可以确保在输入任何其他路由之前服务器的响应已经返回。

  

你如何控制缓存?

大多数情况下你不担心。如果需要,您可以在超时后刷新()单个记录。

  

什么时候使用.find()和.all()。你使用.find()然后.all()吗?多久了?

取决于你想要达到的目标。在我们的应用程序中,我们在应用程序路由中使用find(),然后在其他路由中使用all()或filter()。

  

.all()是否有一些到期日期,以便在一段时间后它可以发出新请求?

不。它永远不会发出新的请求

  

或者它使用本地存储,所以我必须手动清除它?

它不使用本地存储,记录在内存中。所以肯定F5会清除缓存。

  

假设我有一些数据,我想每周只刷一次?我该怎么办呢?现在,每次我进入或重新访问同一路线时,都会发出新请求。我怎么能避免这个?

那么我们假设您只在应用程序路由中使用find(),并且该用户将浏览器保持打开状态1周并且记录已过期。有很多方法可以刷新,什么是容易/最好的取决于它们是否一次过期或者它们是否一次超时。

  • 对过期记录进行一些计时器检查,并根据需要调用refresh()。
  • 拥有您在某个计划中更新的Ping模型。当服务器响应更新时,它可以加载任何已更改的记录。
  • 或者可以每周刷新一次浏览器(通过window.location ...)

答案 1 :(得分:2)

您调用缓存的是商店的内容。通常有两种方法来更新商店以反映在后端方面所做的更改:

  • 更改发生在用户交互/调用服务器上。如果您在后端更新多个记录,则可以使用该请求的响应来加载它们。
  • 更改在后端(背景作业)异步发生。您可以使用websocket将这些更改推送到客户端。