EmberJS:登录后返回当前路线

Chr*_*dge 8 ember.js

我有一个应用程序,匿名用户可以看到只读视图.当用户单击要登录的链接时,我想保存当前路由和模型,并在成功进行身份验证后将其还原.

这与拦截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)

这适用于静态路由,但对于动态路由,模型和路由参数将丢失.

如何捕获当前控制器的模型或路由参数,以便我可以恢复它们?

Chr*_*dge 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);
        }
    }
});
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)