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

wry*_*ych 20 ember.js ember-data

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

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

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

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

Mik*_*tti 21

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

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

所以在技术上这仍然是通过路由,但是当应用程序"启动"时加载数据的最佳方法是通过Application Route的模型钩子.

App.ApplicationRoute = Ember.Route.extend({
  model: function({
    return App.Post.find();
  })
})
Run Code Online (Sandbox Code Playgroud)

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

你如何控制缓存?

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

什么时候使用.find()和.all().你使用.find()然后.all()吗?多长时间?

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

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

不.它永远不会提出新的要求

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

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

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

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

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