8

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

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

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

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

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

4

3 回答 3

4

坏消息:现在,当 ember-data 在 find() 上得到 404 时,它什么也没做。完全没有。该模型永远处于“加载”状态。

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

--- 我最初提供了一个findRESTAdapter. 然后我注意到它find没有通过它应该加载的记录实例。因此,不要通过将记录置于错误状态来继续处理 404。

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

于 2013-03-23T02:15:48.217 回答
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();
});

这将加载并创建错误模型的新实例并将其放入存储中。

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

于 2013-03-23T17:01:24.763 回答
0

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

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

引起我注意的两个事件是 becomeError 和 didLoad。

就我而言,我能够执行以下操作:

// 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

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

于 2013-06-01T17:25:50.897 回答