我目前很难用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.sessionController
的init
方法中处理App.sessionController.signedIn
标志的初始值。。。