GWT-Platform将演示者展示在一起

时间:2012-08-21 14:02:09

标签: java gwt gwt-platform gwt-mvp

嘿所以我只是在学习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));
    }
}

}

1 个答案:

答案 0 :(得分:0)

据我所知,你想为不同的主要内容提供不同的侧边菜单 在这种情况下,有两种解决方案:

  1. 将菜单视为普通的Presenter(对于每种主要内容类型,您可能会有多个菜单)。您只需要使用与主要内容Presenter相同的历史记录标注相应的MenuPresenter。因此,对于上面的示例,您将使用与PhoneCallMenuPresenter相同的历史记录标注PhoneCallPresenter。当您导航到/phonecall(或任何历史记录标记)时,PhoneCallPresenterPhoneCallMenuPresenter都会自动显示。 (你不必做任何事情)。
  2. 如果您只想拥有一个MenuPresenter并将逻辑放在Presenter本身中显示的内容,我建议使用PresenterWidget代替普通{{1} }}。 Presenter会被注入MenuPresenterWidget,并会被添加到LayoutPresenter广告位。您可以为LayoutPresenter.SIDE定义一个setter来指定当前显示的主要内容(将从MenuPresenterWidget调用setter,或者您可以覆盖LayoutPresenter方法并检查当前位置请求并决定在菜单中显示的内容。
  3. 对于解决方案1,每个主要内容onReset()必须有一个MenuPresenter,并且可能有多个代码行是多余的(您可以创建一个基础Presenter并从中派生)。因此,如果你在副菜单中有很多业务逻辑,主要内容与主要内容完全不同,我会选择解决方案1.如果你只显示不同的链接,那么创建MenuPresenter的开销就会很大。每个主要内容MenuPresenter可能会很高,我会选择解决方案2,并为所有主要内容类型只创建一个Presenter并始终显示它。

相关问题