Ember.js 嵌套路由:在错误操作中处理失败的子查找将丢失父上下文

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() {

我最近一直在将我维护的一些余烬应用程序移植到RC 8,并遇到了这个问题

在路由器改头换面登陆之前,我有时会通过余烬数据
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')
      ,在本上下文中也不可用。