嵌套路由:处理失败的子查找错误操作失去父上下文

时间:2013-08-31 05:50:36

标签: ember.js ember-data ember-router

我最近将我维护的一些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

有谁知道为什么会这样或者如何避免它?

注意:

  • 我知道这与Ember Data没有任何关系。但是,在没有添加任何内容的情况下实现没有Ember Data的等价物只会使示例更加复杂
  • 有一些小小的黑客可以使Ember Data在jsbin中按预期工作:
    • 我正在预加载父模型,以避免从任何地方加载它。
    • 我没有做任何特别的事情来为子模型提供数据。该应用只向/authors/undefined/articles/not_found发出请求。这实际上返回了200但是炸弹,因为响应是html。正确返回404响应的API会提供相同的behvaiour。
    • 我记得前一段时间读过一些可用于构建虚假API响应的服务,以便与jsfiddle或jsbin等服务一起使用。如果有人知道它是什么,请评论。

1 个答案:

答案 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