用于会话管理的Ember.js StateManager



我目前很难用StateManager来管理哪个状态应该是活动的,这取决于对服务器的会话检查。我本以为有一个启动状态来检查会话,并确定signedout或signedin状态应该是活动的,这会起作用。

App = Ember.Application.create();
App.sessionController = Ember.Object.create({
  signedIn: false,
  isSignedIn: function() {
    return this.signedIn;
  },
  signOut: function() {
    this.signedIn = false;
    App.stateManager.goToState('signedout');
  },
  signIn: function() {
    this.signedIn = true;
    App.stateManager.goToState('signedin');
  }
});
App.stateManager = Ember.StateManager.create({
  start: Ember.State.create({
    enter: function(sm) {
      this._super(sm);
      if (App.sessionController.isSignedIn()) {
        sm.goToState('signedin');
      } else {
        sm.goToState('signedout');
      }
    }
  }),
  signedin: Ember.State.create({
    enter: function(sm) {
      this._super(sm);
      console.log('entered signedin state');
    },
    exit: function(sm) {
      this._super(sm);
      console.log('exited signedin state');
    }
  }),
  signedout: Ember.State.create({
    enter: function(sm) {
      this._super(sm);
      console.log('entered signedout state');
    },
    exit: function(sm) {
      this._super(sm);
      console.log('exited signedout state');
    }
  })
});
App.sessionController.signIn();

这样做似乎会导致无法正确执行退出。所以我想问,处理需要身份验证的Ember.js应用程序的状态的首选方法是什么(正确的,因为我的方法显然是错误的)?

问题来自于管理初始状态的方式:定义一个没有exit方法的start状态,则不处理退出转换。

您可以如下声明初始状态:

initialState: 'signedout',

而不是声明start状态或在start状态上提供exit方法。

IMO,更好的方法是使用initialState属性,这样可以避免代码重复。为了管理可能已经签名的情况,可以在App.sessionControllerinit方法中处理App.sessionController.signedIn标志的初始值。。。

最新更新