Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Emberjs:将持久数据从远程API保存到本地存储_Javascript_Ajax_Ember.js_Ember Data - Fatal编程技术网

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

Javascript Emberjs:将持久数据从远程API保存到本地存储,javascript,ajax,ember.js,ember-data,Javascript,Ajax,Ember.js,Ember Data,对于Ember从远程API获取数据并将其保存在浏览器中的方式,我仍然有点困惑 因此,我创建了一个REST适配器,用Ajax调用、序列化程序和相应的模型获取记录集。假设它们是帖子,我已经成功地创建了一个帖子索引页面,用户可以点击任何帖子进入帖子详细信息页面 Ajax调用发生在索引页面上,使用Ember inspector,很明显所有记录都存储在本地存储中 但是,当我单击每个帖子详细信息页面上的“返回链接”时,它确实会重定向到'/posts/',但它似乎再次调用ajax。因此,所有帖子都是从API中

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

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

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

但是,当我单击每个帖子详细信息页面上的“返回链接”时,它确实会重定向到'/posts/',但它似乎再次调用ajax。因此,所有帖子都是从API中获取的,这使得页面的响应性大大降低

以下是我的问题:

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

    更新:

    我的帖子适配器:

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


    关于第一个问题:这取决于路线的模型回调。如果使用存储区的,将不会再次发出Ajax请求。(但是:您有责任在第一时间获取数据。您可能希望将数据侧向加载到某个地方,或者如果
    all
    未返回任何内容,则可能需要调用
    find
    。这取决于您的应用程序


    关于第二个问题:RESTAdapter应可用于单个数据项以及列表。您可以使用在路由中实现模型挂钩。如果您使用对象(而不是ID)执行此路由,这个钩子不会被调用。因此,钩子只会在需要时被调用。

    谢谢你回答我的问题!我使用了
    find
    方法来获取两条路径中的记录。但是我如何“第一次获取数据”?我假设使用RESTAdapter获取记录会自动将它们保存到本地存储中,对吗?那么,如果存储中已有记录,为什么
    find
    方法仍必须发出请求?余烬存储不知道后端的数据是否会更改。因此,不合格的
    find
    (只有类型,没有ID)将始终发出一个新的Ajax调用。(除了我最初的回答之外:如果您将钩子与
    find(type,ID)
    一起使用,并且具有该ID的记录已经存在,那么您也不会有Ajax调用。)本质上这是一个设计决策。如果已经发布了一个不合格的查找,我们可以记住,但ember不会这样做。因此,您必须自己做。在最简单的情况下,尝试全部,如果它是空的,请尝试查找。感谢您的解释,这非常有意义!问题现在已经解决了!:)
    App.PostsRoute = Ember.Route.extend({
      model: function() {
        return this.store.find('post');
      }
    })