我正在使用Ember 1.0.0 pre并使用REST Adapter从Rails API获取对象。 如果通过REST API找到对象并将找到的模型对象设置为视图模型,则呈现模板。为了做到这一点,我使用Route中的模型钩子,一切似乎都很好。 当然,如果找不到模型对象,我想渲染一些特殊的404模板/视图。 问题是如果REST适配器返回错误,模型挂钩将停止处理。
我在ember-data路线图中看到,还不支持错误处理。
我不明白的是,如果发生错误,Ember不会在路由中调用重定向挂钩。(我该如何处理此类错误?)
这是路线:
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然后渲染部分模板,但问题是视图根本没有渲染(我假设完全是因为同样的问题)。
答案 0 :(得分:1)
我要做的是创建一个摘要,然后让你的路线扩展该路线。我created a working JSFiddle for you,但请让我解释一下。
我们的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
方法并执行逻辑操作:
errorRedirectTo
; defaultRender
的指定呈现默认值。如果模型为空,那么我们只需指定我们希望渲染404路线(errorRedirectTo
),但默认情况下我们要渲染默认路线(defaultRender
)
要查看它的实际效果,请查看前面提到的JSFiddle。注释第27行以查看呈现的404页面,因为该对象为null
。
我希望这有帮助!