嘿,所以我只是在学习 gwtp 框架,我遇到了一些困境。我在顶层有一个 LayoutPresenter,它有一个主内容槽和菜单内容槽,如果可能的话,我正在尝试找到一种方法将每个槽的演示者绑定在一起,以便在显示主要内容时它会自动显示正确的侧菜单。目前,我在菜单的演示器中有一个静态布尔值,可以在揭示和隐藏上更新。然后,我可以检查菜单在显示主要内容时是否可见,如果不是,我会显示它。
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;
}
}
然后在主要内容演示者中:
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));
}
}
}
据我所知,您希望为不同的主要内容使用不同的侧边菜单。
在这种情况下,有两种解决方案:
- 将菜单视为普通演示者(每种主要内容类型可能会有多个菜单(。您只需要使用与主要内容演示者相同的历史记录令牌注释相应的
MenuPresenter
。因此,对于上面的示例,您将有一个使用与PhoneCallPresenter
相同的历史记录令牌注释的PhoneCallMenuPresenter
。当您导航到/phonecall
(或任何您的历史令牌(时,PhoneCallPresenter
和PhoneCallMenuPresenter
都会自动显示。(您不必执行任何操作(。 - 如果您只想有一个
MenuPresenter
并将要显示的逻辑放在Presenter
本身中,我建议您使用PresenterWidget
而不是普通Presenter
。MenuPresenterWidget
将被注入LayoutPresenter
,并添加到LayoutPresenter.SIDE
槽中。您可以为MenuPresenterWidget
定义一个资源库,以指定当前显示的主要内容(将从LayoutPresenter
调用资源库(,或者您可以重写onReset()
方法并检查当前位置请求并决定在菜单中显示什么。
对于解决方案 1,您必须为每个主要内容Presenter
设置一个MenuPresenter
,并且可能有许多代码行是多余的(您可以创建一个基本MenuPresenter
并从中派生(。因此,如果您在侧菜单中有很多业务逻辑,这些逻辑从主要内容到主要内容都有很大不同,我会选择解决方案 1。如果您只显示不同的链接,则为每个主要内容创建MenuPresenter
的开销可能会很高Presenter
我会使用解决方案 2 并仅为所有主要内容类型创建一个MenuPresenterWidget
并始终显示它。