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

时间:2015-05-04 11:08:57

标签: javascript ajax ember.js ember-data

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

所以我创建了一个REST适配器来获取带有Ajax调用,序列化器和相应模型的记录集。假设它们是帖子,我已经成功发布帖子索引页面,用户可以点击任何帖子进入帖子详细信息页面。

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

但是当我点击"后退链接"这可以在每个帖子详情页面上找到,它会重定向到' / posts /' ,但它似乎再次进行ajax调用。因此,所有帖子都会从API中获取,再次使页面的响应性降低。

这是我的问题:

  1. Ember的那部分是如何工作的?如何使Ember只是从本地商店获取记录而不是一次又一次地进行Ajax调用? (除非用户刷新浏览器)
  2. 如果我向' post / 1' 发出GET请求,则没有数据可用,因为在此路由中不应进行Ajax调用。但是我如何让数据显示出来呢?我是否应该为单个帖子设置另一个REST适配器,或者如果已经进行了Ajax调用,是否可以从本地存储获取记录?
  3. 希望有意义并提前感谢!

    更新

    我的帖子适配器:

    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;
        })
      }
    });
    

    我的帖子和帖子路线:

    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');
      }
    })
    

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题:这取决于路线的模型回调。如果您使用商店的all method,则不会再次生成Ajax请求。 (但是:您有责任在第一时间获取数据。您希望在某处稍微加载数据,或者如果 textArea = new JTextArea(); textArea.setFont(new Font("Arial", Font.PLAIN, 12)); 没有返回任何内容,可能需要致电find。这取决于你的申请。

关于第二个问题:RESTAdapter应该可用于单个数据项和列表。您可以使用find在路径中实现模型挂钩。如果你link-to这个路由带有一个对象(而不是一个ID),那么这个钩子就不会被调用。所以只有在需要时才会调用钩子。