Emberjs:将持久数据从远程 API 保存到本地存储

Emberjs: Save persistent data from remote API to local storage

我仍然对 Ember 从远程 API 获取数据并将其保存在浏览器中的方式感到困惑。

所以我创建了一个 REST 适配器,通过 Ajax 调用、序列化程序和相应的模型来获取记录集。假设他们是posts,我已经成功制作了一个posts的索引页面,用户可以点击任何post进入post详情页面。

Ajax 调用发生在索引页面上,使用 Ember 检查器,很明显所有记录都存储在本地存储中。

但是当我单击每个 post 详细信息页面上可用的 "back link" 时,它会重定向到 '/posts/' 但它似乎再次调用 ajax 。因此,所有 post 都从 API 中获取,再次使页面的响应速度大大降低。

这是我的问题:

  1. Ember 的那部分是如何工作的?我如何让 Ember 简单地从本地存储中获取记录而不用一次又一次地调用 Ajax? (除非用户刷新浏览器)
  2. 如果我向 'post/1' 发出 GET 请求,则没有数据可用,因为在这条路线中不应进行 Ajax 调用。但是我如何让数据显示出来呢?我是否应该为个人 post 设置另一个 REST 适配器,或者如果已进行 Ajax 调用,是否可以从本地存储获取记录?

希望这是有道理的,提前致谢!

更新:

我的 post 适配器:

App.PostAdapter = DS.RESTAdapter.extend({
    findAll: function(store, type, sinceToken) {
      var url = 'THE URL TO GET JSON BACK'; 
      return $.getJSON(url).then(function(data) {
        return posts;
    })
  }
});

我的Post和Post的路线:

App.PostRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('post', params.postId);
  }
})

App.PostsRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('post');
  }
})

关于你的第一个问题:这取决于你路由的模型回调。如果您使用商店的 all method,则不会再次发出 Ajax 请求。 (但是:您有责任在第一时间获取数据。如果 all 没有 return 任何东西,您可能想将其侧载到某个地方或者可能想要调用 find。这取决于您的应用程序。

关于您的第二个问题:RESTAdapter 应该可用于单个数据项和列表。您可以使用 find. If you link-to 带有对象(而不是 ID)的路由在路由中实现模型挂钩,不会调用此挂钩。所以这个钩子只会在需要的时候被调用。