在我的设计中,我希望有一个视图/演示者对,其中演示者是一个扩展的抽象类。例如,我的设计包含一堆一次一个问题。对于是/否问题,我可能有一个视图/演示者对。我想要一个带有抽象方法的YesOrNo演示者,如getQuestion,onYes,onNo。这个演示者的揭示会设置问题,重载的uibinderHandlers会调用你和onNo。然后,我可以使用HasDogYesOrNo演示者扩展YesOrNo演示者,该演示者将包含如果使用有狗,该怎么做的业务逻辑。我可能有类似的HasCatYesOrNo。
所以我创建了两个扩展泛型
的类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 :(得分:0)
在多个Presenter中重用View的最佳方法是创建一个PresenterWidget及其关联的View,并将其注入到您需要的Presenter中。
我必须使用不同的业务逻辑演示者重用相同的视图,并让每个业务逻辑演示者都可以加入书签
这正是PresenterWidget的用途。这是PresenterWidget的具体example,可以在整个应用程序中重复使用。
答案 1 :(得分:0)
我相信[正如Renaud所说,你正在寻找PresenterWidget
。但是我也认为只有Presenters才能做你想做的事。
你可以做的是为每个child-presenter声明一个视图接口(如果你想要在它们之间共享一些逻辑,这些子视图接口可以扩展父视图接口)
所以你会有
(注意&#34; - &gt;&#34;表示&#34;取决于&#34;)
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();
通过这样做你可以
这有意义吗?
答案 2 :(得分: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);
视图绑定未绑定在单例中,以确保在每个演示者中注入新的视图实例。