【问题标题】:ember-data - store.find('model') always queries the serverember-data - store.find('model') 总是查询服务器
【发布时间】:2013-10-29 10:08:09
【问题描述】:

详情:ember-data-1.0.0.beta.3 和默认的 RESTAdapter

我可能误解了store.find() 方法的工作原理,但据我了解,如果我要求的记录已存在于商店中,则以下代码不应查询服务器:

var IndexRoute = Em.Route.extend({
    model: function() {
       return this.store.find('link');
    },
});

来自 DS.Store.find() 的 emberjs.com 文档:

find 方法将始终返回一个承诺,该承诺将与记录一起解决。如果记录已经在 store 中,promise 将立即解决。否则,store 会要求适配器的 find 方法查找必要的数据。

我有另一个具有完全相同模型钩子的路由,但是当我访问该路由时,即使数据已经在存储中,服务器也会被查询。如果我回到索引路由,它会再次被查询。 .find() 不应该处理这个吗?

【问题讨论】:

  • 你有 Chrome 的 Ember 插件吗?您可以检查数据是否在 Ember 存储中。

标签: javascript ember.js ember-data


【解决方案1】:

find 方法总是会返回一个将被解析的 Promise 与记录。如果唱片已经在商店中,则承诺 将立即解决。否则店家会问 适配器的 find 方法来查找必要的数据。

这仅在通过 id this.store.find('link', 1) 查找时有效。使用this.store.find('link') 将始终在服务器中执行请求。

您可以使用all方法this.store.all('link')获取本地数据。但是在您的应用程序的某些地方,您需要使用 find 方法预加载该数据。否则all 将不返回任何内容。

您可以使用以下方法来获得所需的行为:

App.ApplicationRoute = Ember.Route.extend({
    model: function() {
        // preload all data from the server once
        this.store.find('person');
    }
});

App.LinksRoute = Ember.Route.extend({
  model: function() {      
      // get the local data without request the server
      return this.store.all('person');
  }
});

App.OtherRoute = Ember.Route.extend({
  model: function() {
      // get the local data without request the server
      return this.store.all('person');
  }
});

我对此做了一个小提琴,请看http://jsfiddle.net/marciojunior/Az2Uc/

那个小提琴使用 jquery mockjax,如果你看到浏览器控制台 MOCK GET: /people 只显示一次,这就像一个常规的 xhr 请求,但它是模拟的。转换到people1people2 不会执行其他请求,只是获取本地数据。

【讨论】:

  • 感谢您的澄清。我有一个相关的问题。也许你知道答案:我有一个类别模型,我在 ApplicationRoute 中加载了一个类别列表。我也有一个 CategoryRoute,但我有一个不同的问题。 this.store.find('category', params.category_id) 将查询服务器,但它将使用 index 操作,而不是 show 操作。但是,如果我不加载 ApplicationRoute 中的类别,它会按预期工作。
  • 对不起,我不明白你的问题。我建议您创建另一个问题,以便其他人可以提供帮助。
  • 您好,感谢您抽出宝贵时间。我在这里添加了一个更详细的问题:stackoverflow.com/questions/19680014/…。如果可以的话,请看一下。
  • 感谢您的回答。不幸的是,我发现 ember-data 的文档对于 find() 方法如何使用缓存非常具有误导性。他们在文档中的任何地方都提到了这一点吗?
  • 非常感谢您提供这些信息。这帮助我消除了一些疑问! :)
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多