1

非常に基本的なEmber.StateManagerの構築を開始し、正確なcurrentStateの取得に問題があります。私の理解では、状態のenterコールバックが実行されるまでに、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メソッドと、遷移を表すオブジェクトを2番目の引数として呼び出します。

ありがとう!

4

1 に答える 1

3

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メソッドが呼び出された後に設定されます。これにより、表示されている内容が説明されます。

移行後にコンソールで現在の状態名を取得することで確認できます。

于 2012-12-12T18:19:05.557 に答える