嘿所以我只是在学习gwtp框架而且我遇到了一个两难的问题。我在顶层有一个LayoutPresenter,它有一个主内容插槽和菜单内容插槽,我试图找到一种方法将每个插槽的演示者绑定在一起,如果可能的话,所以当主要内容被显示时,它会自动显示正确的一面菜单。目前我在Menu的Presenter中有一个静态布尔值,它在onReveal和onHide上得到更新。然后,我可以检查在显示主要内容时菜单是否可见,如果不是,我会将其显示出来。
public class MenuPresenter extends Presenter<MenuPresenter.MyView, MenuPresenter.MyProxy> {
private static boolean hidden = true;
...
@Override
protected void revealInParent() {
RevealContentEvent.fire(this, LayoutPresenter.SIDE, this);
}
@Override
protected void onReveal(){
super.onReveal();
hidden = false;
}
@Override
protected void onHide(){
super.onHide();
hidden = true;
}
public static boolean isHidden(){
return hidden;
}
}
然后在主要内容Presenter:
public class ContentPresenter extends
Presenter<ContentPresenter.MyView, ContentPresenter.MyProxy> {
...
private final DispatchAsync dispather;
private final PlaceManager placeManager;
@Inject
public PhoneCallPresenter(final EventBus eventBus, final MyView view, final MyProxy proxy, final DispatchAsync dispatcher, final PlaceManager placeManager) {
super(eventBus, view, proxy);
this.dispather = dispatcher;
this.placeManager = placeManager;
}
@Override
protected void revealInParent() {
RevealContentEvent.fire(this, LayoutPresenter.CONTENT, this);
}
@Override
protected void onReveal() {
super.onReveal();
if (MenuPresenter.isHidden()){
placeManager.revealPlace(new PlaceRequest(NameTokens.menu));
}
}
}
答案 0 :(得分:0)
据我所知,你想为不同的主要内容提供不同的侧边菜单 在这种情况下,有两种解决方案:
MenuPresenter
。因此,对于上面的示例,您将使用与PhoneCallMenuPresenter
相同的历史记录标注PhoneCallPresenter
。当您导航到/phonecall
(或任何历史记录标记)时,PhoneCallPresenter
和PhoneCallMenuPresenter
都会自动显示。 (你不必做任何事情)。MenuPresenter
并将逻辑放在Presenter
本身中显示的内容,我建议使用PresenterWidget
代替普通{{1} }}。 Presenter
会被注入MenuPresenterWidget
,并会被添加到LayoutPresenter
广告位。您可以为LayoutPresenter.SIDE
定义一个setter来指定当前显示的主要内容(将从MenuPresenterWidget
调用setter,或者您可以覆盖LayoutPresenter
方法并检查当前位置请求并决定在菜单中显示的内容。对于解决方案1,每个主要内容onReset()
必须有一个MenuPresenter
,并且可能有多个代码行是多余的(您可以创建一个基础Presenter
并从中派生)。因此,如果你在副菜单中有很多业务逻辑,主要内容与主要内容完全不同,我会选择解决方案1.如果你只显示不同的链接,那么创建MenuPresenter
的开销就会很大。每个主要内容MenuPresenter
可能会很高,我会选择解决方案2,并为所有主要内容类型只创建一个Presenter
并始终显示它。