我使用的是Ember 1.0.0 pre,并使用REST适配器从Rails API获取对象。如果对象是通过REST API找到的,我将呈现一个模板,并将找到的模型对象设置为视图的模型。为了做到这一点,我在Route中使用了模型挂钩,一切似乎都很好。当然,如果找不到模型对象,我想渲染一些特殊的404模板/视图。问题是,如果REST适配器返回错误,模型挂钩将停止处理。
我在ember数据路线图中看到错误处理还不受支持。
我不明白的是,如果发生错误,Ember为什么不调用Route中的重定向挂钩(我该如何处理此类错误?)
这是路线:
App.MyRoute = Ember.Route.extend({
renderTemplate: function() {
this.render('mymodel')
},
model: function(params) {
return App.MyModel.find(params.id);
},
redirect: function() {
// I want to redirect to another route
// if the model is not found via the find method.
// However, this hook is not called if the previous one
// does not return an object
}
})
还有其他解决方案吗?我知道,如果视图的模型为null,我可以检入模板,然后渲染部分模板,但问题是视图根本没有渲染(我认为正是因为同样的问题)。
我要做的是创建一个抽象,然后让您的路由扩展该路由。我已经为您创建了一个工作JSFiddle,但请让我解释一下。
我们的App.IndexRoute
可以包含App.MyRedirectRoute
中的所有逻辑,但由于其他路由器可能需要相同的功能,因此最好创建一个抽象,因此如果/当您再次需要此功能时,您可以再次扩展App.MyRedirectRoute
以防止重新编写代码。
不幸的是,Ember.JS没有检测模型是否为空以及呈现不同页面的逻辑。也许在未来这将成为现实(那太好了!),但我们可以自己做。
我们的App.IndexRoute
非常简单:
App.IndexRoute = App.MyRedirectRoute.extend({
defaultRender: 'home',
errorRedirectTo: '404',
model: function(params) {
// We've found a model!
return Ember.Object.create({ params: params });
// We've not found a model!
return null;
}
});
如果模型有效,那么我们可以渲染home
路由,否则我们将渲染404
路由。从路线返回模型时没有任何变化。
renderTemplate
包含用于呈现适当视图的逻辑。因此,我们在抽象中重载renderTemplate
方法,并做逻辑工作:
- 如果Ember.JS认为模型是空的,那么我们将按照
errorRedirectTo
指定的方式渲染视图 - 如果模型被认为是有效的,那么我们将渲染默认值,如
defaultRender
所指定的
如果模型为空,那么我们只需指定要渲染404路由(errorRedirectTo
),但默认情况下,我们要渲染默认路由(defaultRender
)。
要了解它的实际操作,请查看前面提到的JSFiddle。注释掉第27行以查看呈现的404页面,因为对象是null
。
我希望这能有所帮助!