2015-09-04 57 views
0

在我的設計中,我想要一個視圖/演示者對,其中演示者是一個可以擴展的抽象類。例如,我的設計由一系列問題組成,每次問一個問題。對於是/否的問題,我可能會有一個視圖/演示者對。我希望有一個YesOrNo演示者,抽象方法如getQuestion,onYes,onNo。這位主持人的露面會產生疑問,而超載的uibinderHandlers會打電話給你,並且不會。然後,我可以擴展YesOrNo主持人與HasDogYesOrNo主講人,其中將包含業務邏輯,如果使用有狗,該怎麼做。我可能有類似的HasCatYesOrNo。GWTP和抽象主持人類

所以我創建了一個擴展了一般

YesNoPresenter<T extends Proxy<?>> extends Presenter<YesNo.MyView, T> 

每個然後我定義的類,如

public class HasCatsYesNoPresenter extends YesNoPresenter<HasCatsYesNoPresenter.MyProxy> 

當我去約束他們,我有

bindPresenter(YesNoPresenter.class, YesNoPresenter.MyView.class, YesNoView.class, 
      HasCatsYesNoPresenter.MyProxy.class); 
bindPresenter(YesNoPresenter.class, YesNoPresenter.MyView.class, YesNoView.class, 
      HasDogsYesNoPresenter.MyProxy.class); 
兩班

但我得到一個錯誤,

$MyView is Double-bound: Bound at com.gwtplatform.mvp.client.gin.AbstractPresenterModule ... 

看來我無法將兩個演示者綁定到相同的視圖?我真的想重複使用視圖,但把不同的業務邏輯背後。在GWTP中有更好的方法嗎?我必須擁有與不同的業務邏輯主持人重複使用相同的視圖,並讓每個業務邏輯演示者都可以收藏。一個喜歡也會讓我的業務邏輯演示者成爲匿名類,但這可能會要求太多。

還有其他一些方法來實現我簡單的YesNo情況下的演示者,但我有一些更復雜的演示者,我認爲重用代碼的最佳方式是使用該演示者所需的邏輯來擴展基本演示者。 yesnopresenter只是一個例子。

+0

我看到我需要將主持人綁定到代理,然後使用bindSharedView將基本主持人綁定到視圖。但是現在我很困惑基本演示者(抽象)類應該延伸到什麼地方?我問,因爲代理應該在presenterImpl類中,但是在基類中的視圖? – Michael

回答

0

在多個Presenters中重用視圖的最佳方式是創建PresenterWidget及其關聯的視圖並將其注入到所需的Presenters中。

我的必備品是重複使用不同的業務邏輯演示了同樣的觀點,並有各自的業務邏輯的主持人是可收藏

這正是一個PresenterWidget是。這是PresenterWidget的一個具體的example,可以在整個應用程序中重用。

+0

我看不到2(或更多)不同的演示者widget可以通過演示者widget連接到相同的視圖。每個PresenterWidget都需要鏈接到一個View仍然不明顯,你如何將兩個Presenter小部件鏈接到相同的視圖。 – Michael

+0

我看到它的方式是使用PresenterWidget重複使用相同的View,而不是嘗試將相同的View鏈接到不同的Presenter。 – Renaud

0

我相信[就像雷諾說的那樣,你正在尋找使用PresenterWidget。不過,我也認爲只有演講者可以做什麼。

你可以做什麼是聲明每個兒童主持人1個視圖界面

所以(如果你有你想他們之間共享一些邏輯,這些子視圖接口可以擴展父之一)你會

(請注意, 「 - >」 工具 「依賴」)

ParentPresenter -> ParentView 
ParentViewImpl implements ParentView 
ChildPresenter1 -> ChildView1 extends ParentView 
ChildPresenter2 -> ChildView2 extends ParentView 

bind(ChildView1).to(ParentViewImpl) 
bind(ChildView2).to(ParentViewImpl) 

// and then you would have to bind your proxies manually 
bind(MyProxy1.class).asEagerSingleton(); 
bind(MyProxy2.class).asEagerSingleton(); 

通過這樣做,你可以

這是否有意義?

0

bindPresenter快捷方法不是用來處理您的用例。 我相信你想做的事是這樣的:

bind(HasCatsYesNoPresenter.class).in(Singleton.class); 
bind(HasCatsYesNoPresenter.MyProxy.class).asEagerSingleton(); 
bind(HasDogsYesNoPresenter.class).in(Singleton.class); 
bind(HasDogsYesNoPresenter.MyProxy.class).asEagerSingleton(); 
bind(YesNoPresenter.MyView.class).to(YesNoView.class); 

的觀點結合在單未綁定到確保該視圖的新實例,將在每個主持人注入。