在我的路线中,我有一个尝试从服务器请求模型列表的方法
model: ->
App.MyModel.find
projectId: (@modelFor "project").id
现在显然有时这可能会返回 404。
在这种情况发生的那一刻,Ember 只是停止做任何事情。没有渲染视图,没有设置控制器。
那么如何正确处理 404(即显示错误视图)?
在我的路线中,我有一个尝试从服务器请求模型列表的方法
model: ->
App.MyModel.find
projectId: (@modelFor "project").id
现在显然有时这可能会返回 404。
在这种情况发生的那一刻,Ember 只是停止做任何事情。没有渲染视图,没有设置控制器。
那么如何正确处理 404(即显示错误视图)?
坏消息:现在,当 ember-data 在 find() 上得到 404 时,它什么也没做。完全没有。该模型永远处于“加载”状态。
在我看来,这里没有不完全愚蠢的选择。作为最后的手段,我可能会做的是notFound
在我的 DS.Model 上添加一个属性,而不是返回 404,而是返回 JSON 并notFound
设置为true
. 很痛苦,我知道...
--- 我最初提供了一个find
在RESTAdapter
. 然后我注意到它find
没有通过它应该加载的记录实例。因此,不要通过将记录置于错误状态来继续处理 404。
[注意:自 2013 年 3 月以来,ember-data 发生了巨大变化,此答案中的信息可能不再有效]
顺便说一句,“新”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 并没有真正“接受”这一点。该应用程序刚刚停止路由,不再执行任何操作。所以这似乎也是一个死胡同:(
我今天也遇到了这个问题。
但是,在查看源代码后,似乎模型实际上已设置为使用 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
希望如果这确实是我们应该处理的方式,那么在不久的将来,指南中会添加一些文档。