我有一个应用程序,匿名用户可以看到只读视图.当用户单击要登录的链接时,我想保存当前路由和模型,并在成功进行身份验证后将其还原.
这与拦截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);
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
这适用于静态路由,但对于动态路由,模型和路由参数将丢失.
如何捕获当前控制器的模型或路由参数,以便我可以恢复它们?
我找到了一种类似于拦截重定向重试模式的方法.
首先,记住应用程序路由中的最新转换,只要它不是登录的转换:
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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
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');
});
}
}
});
Run Code Online (Sandbox Code Playgroud)