我开始构建一个非常基本的Ember.StateManager,并且在获取准确的currentState时遇到问题。我的理解是,当状态的回调运行时,currentState.name
应该反映这种新的状态。
我正在使用ember-1.0.0-pre.2.min.js
这是我的问题:
My.Tabs = {
init: function() {
MY.Tabs.stateManager.transitionTo('about');
// this logs 'about' which is correct
console.log(this.stateManager.get('currentState.name'));
},
stateManager: Em.StateManager.create({
enableLogging: true,
start: Em.State.create({
exit: function(stateManager) {
// this logs 'start'
console.log(stateManager.get('currentState.name');
}
}),
about: Em.State.create({
enter: function(stateManager) {
// ###### HERE's THE PROBLEM ######
// this logs 'start'...at this point shouldn't this be 'about'?
// since I'm already in the enter callback?
console.log(stateManager.get('currentState.name');
},
exit: function(stateManager) {
return console.log("On about exit");
}
})
})
};
正如您所看到的,当我致电transitionTo('about')
并且该状态的enter
回调已投放时,currentState.name
仍会反映原始状态start
。
只有在transitionTo('about')
之后,currentState.name
才准确。
我的期望是错误的,还是我做错了什么?
文档说明:
转换到新状态后,新的currentState将使用StateManager实例作为其第一个参数调用其enter方法,并将表示转换的对象作为其第二个参数。
谢谢!
答案 0 :(得分:3)
Looking at the source on github我看到了
enterState: function(transition) {
var log = this.enableLogging;
var exitStates = transition.exitStates.slice(0).reverse();
arrayForEach.call(exitStates, function(state) {
state.trigger('exit', this);
}, this);
arrayForEach.call(transition.enterStates, function(state) {
if (log) { Ember.Logger.log("STATEMANAGER: Entering " + get(state, 'path')); }
state.trigger('enter', this);
}, this);
set(this, 'currentState', transition.finalState);
}
显然,currentState
是在调用enter方法之后设置的,这可以解释你所看到的内容。
您可以通过在转换后获取控制台中的当前状态名称来确认。