如何在路线中处理404 Ember Data?

时间:2013-03-22 11:59:44

标签: ember.js ember-data

在我的路线中,我有一个尝试从服务器请求模型列表的方法

 model: ->
    App.MyModel.find
      projectId: (@modelFor "project").id

现在显然有时这可能会返回404。

在发生这种情况的那一刻,Ember停止做任何事情。没有渲染视图,也没有设置控制器。

那么如何正确处理404(即显示错误视图)?

3 个答案:

答案 0 :(得分:3)

坏消息:现在,当在find()上获得404时,ember-data不会做任何事情。完全没有。该模型永远处于“加载”状态。

在我看来,这里没有非完全愚蠢的选择。作为最后的手段,我可​​能会做的是在我的DS.Model上添加notFound属性,而不是返回404,返回将notFound设置为true的JSON。这很痛苦,我知道......

---我最初在find的子类中提供了覆盖RESTAdapter的解决方案。然后我注意到find没有通过它应该加载的记录实例。因此,不要通过将记录置于错误状态来继续处理404。

[注意:自2013年3月以来,余烬数据发生了巨大变化,此答案中的信息可能不再有效]

答案 1 :(得分:0)

顺便说一句,“新”BasicAdapter现在刚刚发布。对我来说问题是,这会使处理404错误更容易吗。

方法#1

我的第一种方法 - 类似于Christopher所建议的 - 是添加一个包含HTTP状态的附加字段。

  status: DS.attr("number");

然后我使用了这个AJAX调用:

$.getJSON(url, data).then(null, function(xhr) {
  return {
    id: id,
    statusCode: xhr.status
  };
}).always(function(data) {
  return process(data).load();
});

这样做是为了将错误响应(xhr)转换为包含请求的id和状态代码的哈希。最后,成功的结果或失败的哈希传递给商店。

这种工作,但不太实用:当您显示所有模型实例的列表时,必须手动过滤掉“模拟”实例。


方法#2

另一个想法是创建一个特殊的错误模型。

App.Error = App.Model.extend({
  status: DS.attr("number")
});

相应的查询:

$.getJSON(url, data).then(null, function(xhr) {
  return App.store.load(App.Error, {}, {
    id: 0,
    status: xhr.status
  });
}).done(function(data) {
  return process(data).load();
});

这将加载并创建错误模型的新实例并将其放入商店。

问题在于,恩伯并没有真正“接受”这个。该应用程序刚停止路由,不再执行任何操作。所以这似乎也是一个死路一条:(

答案 2 :(得分:0)

我今天也遇到了这个问题。

然而,在查看源代码后,看起来该模型实际上已设置为使用Ember.Evented,我们可以为这些情况添加自己的处理程序。

引起我注意的两个事件是“错误”和“载荷”。

在我的情况下,我能够做如下的事情:

// Grab a user by id.
var user_rec = App.User.find( user.id );

// Oh no! Error!
user_rec.on('becameError', function() {
  alert('I could not find you!');
});

// We should be good! Proceed!
user_rec.on('didLoad', function() {
  alert('Your email: '+this.get('email'));
});

以下是github上的来源:https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/model.js

希望如果这确实是我们处理事情的方式,那么在不久的将来指南中会有一些附加的文档。