在我的路线中,我有一个尝试从服务器请求模型列表的方法
model: ->
App.MyModel.find
projectId: (@modelFor "project").id
现在显然有时这可能会返回404。
在发生这种情况的那一刻,Ember停止做任何事情。没有渲染视图,也没有设置控制器。
那么如何正确处理404(即显示错误视图)?
答案 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
希望如果这确实是我们处理事情的方式,那么在不久的将来指南中会有一些附加的文档。