我有一个匿名用户可以看到只读视图的应用。当用户单击要登录的链接时,我想保存当前路由和模型,并在成功验证后恢复它。
这与拦截beforeModel中的转换并重定向到登录的大多数示例略有不同。
App.ApplicationController = Ember.Controller.extend({
actions: {
logIn: function() {
this.set('previousPath', this.get('currentPath'));
this.transitionToRoute('login');
}
}
});
App.LoginController = Ember.Controller.extend({
needs: 'application',
username: '',
password: '',
actions: {
logIn: function () {
var self = this;
App.session.logIn(this.get('username'), this.get('password')).then(
function() {
var route = self.get('controllers.application.previousPath')
self.transitionToRoute(route);
});
}
}
});
这适用于静态路由,但对于动态路由,模型和路由参数将丢失。
如何捕获当前控制器的模型或路由参数,以便我可以恢复它们?
答案 0 :(得分:6)
我找到了一种类似于拦截重定向重试模式的方法。
首先,请记住应用程序路由中的最新转换,只要它不是到登录的转换:
App.ApplicationRoute = Ember.Route.extend({
beforeModel: function(transition) {
this._saveTransition(transition);
},
actions: {
willTransition: function (transition) {
this._saveTransition(transition);
}
},
_saveTransition: function (transition) {
if (transition.targetName !== 'login') {
this.controllerFor('login').set('previousTransition', transition);
}
}
});
输入应用程序或刷新页面时, beforeModel
会触发。 willTransition
会在每次后续过渡时触发。
然后,LoginController可以在成功验证后重试上一次转换:
App.LoginController = Ember.Controller.extend({
username: '',
password: '',
actions: {
logIn: function () {
var self = this;
App.session.logIn(this.get('username'), this.get('password')).then(
function() {
var previousTransition = self.get('previousTransition');
if (previousTransition) {
previousTransition.retry();
return;
}
self.transitionToRoute('index');
});
}
}
});
答案 1 :(得分:1)
指南的案例似乎正是您所寻找的。 p>
App.SomeAuthenticatedRoute = Ember.Route.extend({
beforeModel: function(transition) {
if (!this.controllerFor('auth').get('userIsLoggedIn')) {
var loginController = this.controllerFor('login');
loginController.set('previousTransition', transition);
this.transitionTo('login');
}
}
});
App.LoginController = Ember.Controller.extend({
actions: {
login: function() {
// Log the user in, then reattempt previous transition if it exists.
var previousTransition = this.get('previousTransition');
if (previousTransition) {
this.set('previousTransition', null);
previousTransition.retry();
} else {
// Default back to homepage
this.transitionToRoute('index');
}
}
}
});
有关详细信息,请参阅STORING AND RETRYING A TRANSITION