GWT-Platform представляет ведущих вместе

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

}


person Brian    schedule 21.08.2012    source источник


Ответы (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 для всех основных типов контента и всегда показывал его.

person Ümit    schedule 22.08.2012