EmberJS:登录后返回当前路线

时间:2014-01-14 19:42:06

标签: 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);
                });
        }
    }
});

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

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

2 个答案:

答案 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)

指南的案例似乎正是您所寻找的。

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

相关问题