如何在ember-data中回滚不成功的GET请求

时间:2012-11-12 09:55:18

标签: ember.js ember-data

使用ember-data非常棒,它可以解决我开箱即用的大部分数据处理难题。但是,有一个问题我一直在搜索谷歌搜索,试图找到答案。

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

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

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

  • 我从服务器返回404后,尝试同时调用banana = App.Fruit.find('banana');banana.get('transaction').rollback();

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

  • 我甚至尝试将事务状态设置为“已删除” - 如此:banana.get('stateManager').goToState('deleted'); - 希望它会在App.Fruit.find('banana');之后发出新的GET请求。不幸的是,它没有。

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

1 个答案:

答案 0 :(得分:2)

似乎没有正式的方法可以做到这一点,而这似乎是设计上的。商店(通过它代理所有对find记录的请求)会记住您提供的ID,如果已经看到该ID,则跳过服务器调用。

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

<强> 1。按ID搜索

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

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

因为它是一个搜索,它实际上会返回一个数组 - DS.AdapterPopulatedRecordArray,确切地说。这意味着当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)

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