0

使用 ember-data 非常棒,它开箱即用地解决了我的大部分数据处理挑战。然而,有一个问题我一直在通过谷歌搜索来寻找答案。

假设我向服务器发出 GET 请求以查找记录,App.Fruit.find('banana');. 如果此记录不存在,则后端向客户端发回状态代码 (404)。

现在,在以后的任何给定时间,“香蕉”记录可能由其他人创建,因此存在于服务器上的数据库中。

但是,此时,任何进一步的调用App.Fruit.find('banana');都不会向服务器发出新的 GET 请求。

  • 我试过调用两者banana = App.Fruit.find('banana');,然后banana.get('transaction').rollback();从服务器返回 404。

  • 我也试过App.store.get('defaultTransaction').rollback();看看这是否有效。

  • 我什至尝试将事务状态设置为“已删除” - 就像这样:banana.get('stateManager').goToState('deleted');- 希望它会在之后使App.Fruit.find('banana');问题成为一个新的 GET 请求。不幸的是,它没有。

我的问题是:如果先前的请求没有返回任何数据(404),我如何让 ember-data 再次发出 GET 请求?

4

1 回答 1

2

似乎没有官方的方法可以做到这一点,这似乎是设计使然。存储(通过它代理对记录的所有请求find)会记住您给它的 id,如果该 id 已经被看到,则跳过服务器调用。

但是,在查看代码时,可能有一些技巧可以强制重复查找。

1.按ID搜索

商店不记得您用于复杂查找的查询。如果您调整 Rails 控制器的索引操作以支持这些搜索,您可以像这样重复查询:

fruit = App.Fruit.find({id: 'banana'});

因为它是一个搜索,所以它实际上会返回一个数组——DS.AdapterPopulatedRecordArray准确地说是 a 。这意味着您会知道它在fruit.get('length')大于时起作用0。这也意味着您必须从数组中获取第一条记录才能使用它:

banana = fruit.objectAtContent(0);

为了支持这一点,您的 Rails 控制器操作必须如下所示:

def index
  if params[:id]
    respond_with Fruit.find_all_by_id(params[:id])
  else
    # ...
  end
end

注意:确保返回一个数组,因为这就是 Ember Data 所期望的。

2.手动GET,然后Sideload

如果你能忍受它,你可以向服务器执行手动请求。如果/当服务器响应记录时,您可以将其 JSON 侧载到存储中:

store.load(App.Fruit, json)

这将自动将属性添加到您在内存中的该记录的任何实例中。

于 2012-11-17T17:14:47.410 回答