无法从错误操作过渡

时间:2015-07-23 18:56:50

标签: ember.js

我想在出现错误加载模型时转换到“oops”路由。我的路由器看起来像:

import Ember from 'ember';
import config from './config/environment';

var Router = Ember.Router.extend({
  location: config.locationType
});

export default
Router.map(function() {
  this.resource('invitations', {path: '/invitations'});
  this.resource('oops');
});

InivitationsRoute的错误操作定义为:

import Ember from 'ember';

export default
Ember.Route.extend({

  actions: {

    error: function(error, transition) {

      if (error && error.status === 500) {
        transition.abort();
        this.transitionTo('oops',{'a':'b'});
      }

      // Return true to bubble this event to any parent route.
      return false;
    }

  }
});

现在我遇到的问题是,如果我将一个对象传递给 this.transitionTo('oops',{'a':'b'}); ,那么ember不会甚至尝试进行转换,但如果我只是做了 this.transitionTo('oops'); ,它将转换到路线。问题是我想将错误JSON作为模型传递给此路由!

我的OopsRoute极简主义:

import Ember from 'ember';

export default
Ember.Route.extend({

  setupController: function(controller, model) {
    this._super(controller, model);
  }
});

似乎无法理解为什么它不起作用! 使用ember:1.11.3

1 个答案:

答案 0 :(得分:1)

Ember认为您的{ "a":"b" }是动态细分,因为您尚未指定oops资源的路径。

如果您将资源更改为this.resource("oops", { path: '/' },那么过渡将会起作用,但是您的数据仍然不会被视为模型,(我认为)会将{ "a":"b" }对象视为queryParams来尝试找到一个模型。

由于您的oops路由实际上没有模型,只会用于显示错误消息(我假设),我会做一些事情,比如使用服务来保持路由之间的错误消息。类似的东西:

// services/error-messages.js
export default Ember.Service.extend({
  errorMessage: null
});


// routes/invitations.js
export default Ember.Route.extend({
  errorMessages: Ember.inject.service(),

  actions: {
    error: function () {
      var errors = this.get("errorMessages") // the error-messages service
      errors.set("errorMessage", "Something has gone wrong!");
    }
  }
});


// routes/oops.js
export default Ember.Route.extend({
  errorMessages: Ember.inject.service()

  setupController: function (controller, model) {
    var errors = this.get("errorMessages");
    controller.set("errorToDisplayInTemplate", errors.get("errorMessage");
  }
});


// templates/oops.hbs
{{errorToDisplayInTemplate}}

然后,当你离开oops页面时,显然你想要null出现服务中的错误消息。