我最近将我维护的一些Ember应用程序移植到RC 8并遇到了这个问题。
在路由器改装降落之前,我有时会通过Ember Data find
电话返回的承诺管理控制流程。
例如:
SomeRoute = Ember.Route.extend({
model: function(params) {
var resolve = function(model) { return model; };
var route = this;
var reject = function() { this.transitionTo('someOtherRoute'); };
return SomeModel.find(params.some_model_id).then(resolve, reject);
}
...
});
通过最近的更改,现在可以通过error
操作处理模型回调中创建的错误:
SomeRoute = Ember.Route.extend({
// note: model callback no longer needed--default suffices
actions: {
error: function(reason, transition) {
// check the reason object to determine how/if to handle this error
this.transitionTo('someOtherRoute');
}
}
...
});
我更喜欢后一种方法,因为它使代码更容易阅读并更好地区分问题。
这在大多数情况下运行良好但我在使用嵌套路由的应用程序中遇到了问题。我已经包含了一个简化的示例,后面跟着一个演示该问题的jsbin。
假设我们要显示属于Article
的{{1}}个,且网址如下:Author
。当有人试图查看不存在的文章时,我们希望重定向到“未找到”页面。
如上所述在/authors/:author_slug/articles/:article_slug
回调中管理控制流时,您可以浏览到model
并按预期重定向到/authors/some_author/articles/some_invalid_slug
。
但是,如果通过/authors/some_author/articles/not_found
操作管理重定向到“未找到”页面,则父级上下文会在某个时刻丢失,最后会出现在error
。
您可以在以下jsbins中看到这一点:
http://jsbin.com/eJOXifo/1#/authors/schneier/articles/12345 (重定向到http://jsbin.com/eJOXifo/1#/authors/schneier/articles/not_found)
http://jsbin.com/oNaWelo/1#/authors/schneier/articles/12345 (重定向到http://jsbin.com/oNaWelo/1#/authors/undefined/articles/not_found)
有谁知道为什么会这样或者如何避免它?
注意:
/authors/undefined/articles/not_found
发出请求。这实际上返回了200但是炸弹,因为响应是html。正确返回404响应的API会提供相同的behvaiour。答案 0 :(得分:1)
您对父上下文迷失的权利。诀窍是从转换中提取该上下文,并在调用transitionTo
时将其作为参数传递。所以:
App.ArticlesArticleRoute = Em.Route.extend({
actions: {
error: function(reason, transition) {
console.log('in error handler');
this.transitionTo('articles.notFound', transition.resolvedModels.authors);
}
}
});
通过此更改,访问网址:
http://jsbin.com/iVOYEvA/2#/authors/schneier/articles/my-fake-article
将重定向到:
http://jsbin.com/iVOYEvA/2#/authors/schneier/articles/not_found