2012-11-29 26 views
1

林在我的GWT應用程序中使用GWTP並具有以下結構:GWTP:在註銷清楚主持人

LoginPresenter (Presenter) 
    DashboardPresenter (TabContainerPresenter) 
     TabbedPresenter1 (Presenter) 
     TabbedPresenter2 (Presenter) 
     TabbedPresenter3 (Presenter) 

我第一次開始我的應用程序中,onBind和addTab方法被稱爲在DashboardPresenter,當我導航到選項卡,在該演示者上調用onbind方法。

如果我通過我的PlaceManager創建PlaceRequest並導航回LoginPresenter(通過按下注銷按鈕),我將返回到登錄演示者。

問題是如果我再次登錄,那麼所有的onBind方法都不會被調用,因爲它們仍然在內存中。 onReset和onReveal被正確調用,但我非常希望每個Presenter都被重置,並且每次登錄時都會調用onBind。

我決定登錄事件哪些選項卡應該對用戶可見,並限制DashboardPresenter的addTab方法中的選項卡(如果用戶沒有足夠的權限來查看這些選項卡)。但截至目前,這些標籤是在用戶第一次登錄時設置的,但不是下一次。這意味着如果權限較小的用戶在管理員用戶後登錄,他可以看到與管理員相同的選項卡。不好!

我該如何處理?當用戶註銷(導航到登錄頁面)時,我非常希望「重置」所有演示者或會話。是否Ginjector需要「重置」,以便它不會像以前那樣返回相同的綁定對象?

只是爲了澄清:我們確實有服務器端安全性,禁止用戶無權訪問敏感數據。但是,當用戶登錄時,gwt應用程序會收到用戶可以訪問的功能列表。這用於自定義用戶界面以適應用戶的權限。 (例如基於用戶特權定製可見標籤)。

+0

我應該補充說我目前沒有在演示者上使用解除綁定的方法,因爲我不知道當這些方法被調用時會發生什麼。 –

+0

目前,我的解決方案是使用Window.Location.reload()完成一個完整的頁面重新加載。我不是很喜歡這個,但它有訣竅。仍然需要一個很好的解決方案,在註銷事件中「重置」我的web應用程序...... –

+0

僅供參考'onUnBind()'方法應該手動調用,因此它們不適用於您的情況(參見http:// stackoverflow .COM /問題/ 13396992/gwtp-onunbind,從來沒有所謂的-後收盤-A-主持人/ 13397858#13397858)。 –

回答

0

我不知道這工作:

但你可以嘗試射擊對全球EventBus一個LogoutEvent,在需要進行「卸載」所有Presenters處理它(TabbedPresenter1等),並調用onUnbind()上他們。 後來導航回LoginPresenter

或者你可以把我們的自定義TabData的(子類TabDataBasic並添加標誌hasAccess)。 同樣,你火了LogoutEvent,當你處理它,你可以做這樣的事情:

TabDataDynamic tabData = (TabDataDynamic)getProxy().getTabData(); 
tabData.setHasAccess(false); 
getProxy().changeTab(tabData); 

在YOUT TabPanel實現,你必須確保該選項卡是隱藏的,當標誌設置爲false。

+0

這應該是一個很好的解決方案。謝謝! –

+0

不適合我。 onUnbind不重置我的觀點和主持人... – Kasas

0

我認爲你應該看看網守可以與像主持人可以輕鬆的使用:

@ProxyCodeSplit 
@NameToken(NameTokens....) 
@UseGatekeeper(Your1GateKeeper.class) 
public interface MyProxy extends TabContentProxyPlace<YourPresenter> { 
} 

而且你可以注入一個儀表盤演示網閘是檢查該選項卡可用:

@Singleton 
public class Your1GateKeeper implements Gatekeeper{ 

private DashboardPresenter presenter; 

@Inject 
public ReadOnlyGateKeeper(DashboardPresenter presenter) { 
    this.presenter = presenter; 
} 

@Override 
public boolean canReveal() { 
    return presenter.isAvailable(); 
} 

} 

因此,使用適當的GateKeeper可以讓您達到所需的安全性。

+0

我已經在我的DashboardPresenter上有一個關守,但我沒有想到我的TabbedPresenter上有一個關守,所以我一定會補充一點。謝謝你,基里爾!但是這並不能解決我卸載/解綁主持人的問題,還是我誤解了? –

+0

我建議將顯示邏輯從onBind移動到Gatekeeper。所以你不需要處理卸載。不要認爲真正的卸載是可以達到的,但是你可以很容易地不顯示一些標籤。 –