GWT-Платформа, показывающая докладчиков вместе

Эй, я только изучаю основы gwtp и столкнулся с некоторой дилеммой. У меня есть LayoutPresenter на верхнем уровне, который имеет основной слот контента и слот контента меню, и я пытаюсь найти способ связать своих докладчиков для каждого слота, если это возможно, чтобы при раскрытии основного контента он автоматически показывал правильную сторону меню. В настоящее время у меня есть статическое логическое значение в 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;
}
    }

Затем в Основное содержание Ведущий:

    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 ответ

Решение

Насколько я понял вопрос, вы хотите иметь разные побочные меню для различного основного содержания.
В этом случае есть два решения:

  1. Относитесь к меню как к обычному докладчику (у вас, вероятно, будет несколько из них для каждого основного типа контента). Вам просто нужно аннотировать соответствующие MenuPresenter с тем же маркером истории, что и ваш основной контент Presenter. Так что для приведенного выше примера у вас будет PhoneCallMenuPresenter который аннотирован тем же маркером истории, что и ваш PhoneCallPresenter, Когда вы переходите к /phonecall (или каков ваш исторический токен), оба PhoneCallPresenter а также PhoneCallMenuPresenter будет выявлено автоматически. (вам не нужно ничего делать).
  2. Если вы хотите иметь только один MenuPresenter и поставить логику, что отображать в Presenter Сам я бы рекомендовал использовать PresenterWidget вместо нормального Presenter, MenuPresenterWidget будет введен в LayoutPresenter и будет добавлен к LayoutPresenter.SIDE слот. Вы можете определить сеттер для MenuPresenterWidget указать, какой основной контент отображается в данный момент (сеттер будет вызываться из LayoutPresenter или вы можете переопределить onReset() метод и проверить текущий запрос места и решить, что отображать в меню.

Для решения 1 вы должны иметь один MenuPresenter за каждый основной контент Presenter и потенциально много строк кода будут избыточными (вы можете создать базу MenuPresenter и извлечь из этого). Так что, если у вас есть много бизнес-логики в боковом меню, которое сильно отличается от основного контента к основному контенту, я бы пошел с решением 1. В случае, если вы отображаете только разные ссылки, накладные расходы на создание MenuPresenter по основному содержанию Presenter может быть, и я бы пошел с решением 2 и создать только один MenuPresenterWidget для всех основных типов контента и всегда показывать его.

Другие вопросы по тегам