20

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

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

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

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

4

2 回答 2

21

因此,将从您的评论中回答问题开始:

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

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

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

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

你如何控制缓存?

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

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

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

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

没有。它永远不会提出新的请求

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

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

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

所以好吧,假设您仅在应用程序路由中使用 find(),并且该用户保持浏览器打开 1 周并且记录已过期。有很多方法可以刷新,最简单/最好的方法取决于它们是同时过期还是一次超时。

  • 有一些计时器检查过期记录并根据需要调用 refresh()。
  • 有一个按计划更新的 Ping 模型。当服务器响应更新时,它可以旁加载任何更改的记录。
  • 或者可以每周刷新一次浏览器(通过 window.location ...)
于 2013-05-26T03:25:43.147 回答
2

您所说的缓存是存储的内容。通常有两种方法可以更新存储以反映后端所做的更改:

  • 更改发生在用户交互/调用服务器时。如果您在后端更新多条记录,您可以将它们与该请求的响应一起加载。
  • 更改在后端(后台作业)异步发生。您可以使用 websocket 将这些更改推送到客户端。
于 2013-05-15T22:06:11.700 回答