2012-03-31 51 views
4

我目前在使用状态管理器来管理哪个状态应该处于活动状态时会遇到麻烦,这取决于对服务器的会话检查。我会想到有一个开始状态来检查会话,并确定签名或签名状态是否应该有效。Ember.js用于会话管理的StateManager

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应用程序的状态的首选方式是什么(正确,因为我的显然是错误的)?

回答

1

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

你既可以宣布初始状态如下:

initialState: 'signedout', 

,而不是宣布start状态,或start状态提供exit方法。

IMO,更好的办法是使用initialState属性,因为你避免了代码重复。 为了管理可能的情况下,已经烧焦,你可以应对的App.sessionControllerinit方法App.sessionController.signedIn标志的初始值...

+0

其实我已经有一个初始状态尝试为好。问题出现在每个其他状态的退出进程没有执行。只有初始状态退出进程被执行。这意味着如果我使用的视图不被删除的ViewState。 – digitaltoad 2012-03-31 14:08:27

+0

我不明白...它似乎在这里工作:http://jsfiddle.net/MikeAski/SPfvg/ – 2012-03-31 15:35:15

+0

对不起,我应该更好地解释,我用一个初始状态,因为我会有一个开始状态,以在应用程序加载时调度到正确的状态。这导致了不希望的副作用,我认为这可能是由于在另一个状态的进入过程中使用了goToState。我只是不确定应该在哪里放置代码来确定应用程序加载时的正确状态。 – digitaltoad 2012-03-31 18:42:47