[英]How to transition to a route from an Ember Data Adapter
In my application, I've got an ApplicationAdapter
whose ajaxError
method is customized. 在我的应用程序中,我有一个ApplicationAdapter
其ajaxError
方法是自定义的。 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.