Ember.js 嵌套路由:在错误操作中处理失败的子查找将丢失父上下文
我最近一直在将我维护的一些余烬应用程序移植到RC 8,并遇到了这个问题 在路由器改头换面登陆之前,我有时会通过余烬数据Ember.js 嵌套路由:在错误操作中处理失败的子查找将丢失父上下文,ember.js,ember-data,ember-router,Ember.js,Ember Data,Ember Router,我最近一直在将我维护的一些余烬应用程序移植到RC 8,并遇到了这个问题 在路由器改头换面登陆之前,我有时会通过余烬数据find调用返回的承诺来管理控制流 例如: SomeRoute = Ember.Route.extend({ model: function(params) { var resolve = function(model) { return model; }; var route = this; var reject = function() {
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,它演示了这个问题
假设我们想显示属于作者的文章
s,URL看起来像:/authors/:Author\u slug/articles/:Article\u slug
。当有人试图查看不存在的文章时,我们希望重定向到未找到的页面
在如上所述的模型
回调中管理控制流时,您可以浏览到/authors/some\u author/articles/some\u invalid\u slug
,并按预期重定向到/authors/some\u author/articles/not\u found
但是,如果改为通过错误
操作管理到未找到页面的重定向,则父上下文会在某个点丢失,并且最终会出现/authors/undefined/articles/Not\u Found
您可以在以下JSB中看到这一点:
(重定向到)
(重定向到)
有人知道为什么会发生这种情况或如何避免吗
注:
- 我知道这与余烬数据无关。然而,在没有余烬数据的情况下实现一些等价的东西只会使示例更加复杂,而不添加任何内容
- 有一些小技巧可以让余烬数据在jsbin中按预期工作:
- 我正在预加载父模型,以避免从任何地方加载它
- 我没有做任何特殊的事情来为子模型提供数据。应用程序只是向
http://jsbin.com/articles/12345
。这实际上返回了一个200,但无论如何都会爆炸,因为响应是html。正确返回404响应的API会给出相同的响应
- 我记得不久前读到过一些服务,这些服务可以用来构建假API响应,以便与JSFIDLE或jsbin等服务一起使用。如果有人知道这是什么,请评论
您的权利是,父上下文正在丢失。诀窍是从转换中提取该上下文,并在调用
transitionTo
时将其作为参数传递。因此:
App.ArticlesArticleRoute = Em.Route.extend({
actions: {
error: function(reason, transition) {
console.log('in error handler');
this.transitionTo('articles.notFound', transition.resolvedModels.authors);
}
}
});
通过此更改,访问url:
将重定向到:
您的权利表明父上下文正在丢失。诀窍是从转换中提取该上下文,并在调用transitionTo
时将其作为参数传递。因此:
App.ArticlesArticleRoute = Em.Route.extend({
actions: {
error: function(reason, transition) {
console.log('in error handler');
this.transitionTo('articles.notFound', transition.resolvedModels.authors);
}
}
});
通过此更改,访问url:
将重定向到:
非常感谢!我想我曾经尝试过将父模型作为第二个参数传递给transition to
,但它没有正常工作,因为我调用了this.modelFor('authors')
,在本文中也不可用。非常感谢!我想我曾尝试在某个时候将父模型作为第二个参数传递给transition to
,但它没有正常工作,因为我调用了this.modelFor('authors')
,在本上下文中也不可用。