简体   繁体   English

如何从Ember数据适配器转换到路由

[英]How to transition to a route from an Ember Data Adapter

In my application, I've got an ApplicationAdapter whose ajaxError method is customized. 在我的应用程序中,我有一个ApplicationAdapterajaxError方法是自定义的。 Within that method, I'd like to be able to transition to a given route . 在该方法中,我希望能够转换到给定的路线 How can I do this? 我怎样才能做到这一点?

App.ApplicationAdapter = DS.RESTAdapter.extend({
    ajaxError: function(jqXHR) {
        var error = this._super(jqXHR);
        if (jqXHR) {
            switch(jqXHR.status) {
            // [...]
            case 401:
                // How can I transitionTo('login') here?
            }
            // [...]
        }
    }
});

Instead of transition in the adapter, isn't a good pratice IMHO, you can return an instance of Error and handle it in the error action of the current route: 而不是适配器中的转换,不是一个好的实践恕我直言,您可以返回Error的实例并在当前路由的error操作中处理它:

App.UnauthorizedError // create a custom Error class

App.ApplicationAdapter = DS.RESTAdapter.extend({
    ajaxError: function(jqXHR) {        
        var defaultAjaxError = this._super(jqXHR);
        if (jqXHR) {
            switch(jqXHR.status) {            
                case 401:
                return new App.UnauthorizedError()
            }
        }
        return defaultAjaxError;
    }
});

App.IndexRoute = Ember.Route.extend({
  model: function() {
      return this.store.find('person');
  },
  actions: {
      error: function(reason) {
          // all errors will be propagated to here, we check the instance to handle the UnauthorizedError          
          if (reason instanceof App.UnauthorizedError) {
              this.transitionTo('login')
          }
      }
  }  
});

If you want to use this for all routes, you can put the unauthorized transition in the ApplicationRoute . 如果要将其用于所有路由,可以将未经授权的转换放在ApplicationRoute Because the ApplicationRoute is the parent of all routes, and not handled actions, or actions that return true, will bubble to the parent routes. 由于ApplicationRoute是所有路由的父级,而不是处理的操作或返回true的操作,因此将冒泡到父路由。

App.ApplicationRoute = Ember.Route.extend({
    actions: {
      error: function(reason) {
          if (reason instanceof App.UnauthorizedError) {
              this.transitionTo('login')
          }
      }
  }
});

App.BarRoute = Ember.Route.extend({
    actions: {
        error: function(reason) {
            // handle errors of bar route

            // bubble to application route
            return true;
        }
    }
});

This is a fiddle with this sample http://jsfiddle.net/SkCH5/ 这是这个样本http://jsfiddle.net/SkCH5/的小提琴

Throw the error and allow the error hook on the route to catch it and transition from there. 抛出错误并允许路由上的错误挂钩捕获它并从那里转换。 Additionally you can make a mixin with this logic and add the mixin to all of your routes. 此外,您可以使用此逻辑进行混音,并将mixin添加到您的所有路线中。

Machty has additional information in his gist talking about the new router: https://gist.github.com/machty/5647589 Machty在他的要点中有关于新路由器的更多信息: https ://gist.github.com/machty/5647589

App.AuthenticatedRoute = Ember.Route.extend({
 beforeModel: function(transition) {
  if (!authTokenPresent) { 
   return RSVP.reject();
   // Could also just throw an error here too...
   // it'll do the same thing as returning a rejecting promise.

   // Note that we could put the redirecting `transitionTo`
   // in here, but it's a better pattern to put this logic
   // into `error` so that errors with resolving the model
   // (say, the server tells us the auth token expired)
   // can also get handled by the same redirect-to-login logic.
  }
 },

 error: function(reason, transition) {
  // This hook will be called for any errors / rejected promises
  // from any of the other hooks or provided transitionTo promises.

  // Redirect to `login` but save the attempted Transition
  var loginController = this.controllerFor('login')
  loginController.set('afterLoginTransition', transition);
  this.transitionTo('login');
 }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM