2012-03-31 75 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