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 ответ
Насколько я понял вопрос, вы хотите иметь разные побочные меню для различного основного содержания.
В этом случае есть два решения:
- Относитесь к меню как к обычному докладчику (у вас, вероятно, будет несколько из них для каждого основного типа контента). Вам просто нужно аннотировать соответствующие
MenuPresenter
с тем же маркером истории, что и ваш основной контент Presenter. Так что для приведенного выше примера у вас будетPhoneCallMenuPresenter
который аннотирован тем же маркером истории, что и вашPhoneCallPresenter
, Когда вы переходите к/phonecall
(или каков ваш исторический токен), обаPhoneCallPresenter
а такжеPhoneCallMenuPresenter
будет выявлено автоматически. (вам не нужно ничего делать). - Если вы хотите иметь только один
MenuPresenter
и поставить логику, что отображать вPresenter
Сам я бы рекомендовал использоватьPresenterWidget
вместо нормальногоPresenter
,MenuPresenterWidget
будет введен вLayoutPresenter
и будет добавлен кLayoutPresenter.SIDE
слот. Вы можете определить сеттер дляMenuPresenterWidget
указать, какой основной контент отображается в данный момент (сеттер будет вызываться изLayoutPresenter
или вы можете переопределитьonReset()
метод и проверить текущий запрос места и решить, что отображать в меню.
Для решения 1 вы должны иметь один MenuPresenter
за каждый основной контент Presenter
и потенциально много строк кода будут избыточными (вы можете создать базу MenuPresenter
и извлечь из этого). Так что, если у вас есть много бизнес-логики в боковом меню, которое сильно отличается от основного контента к основному контенту, я бы пошел с решением 1. В случае, если вы отображаете только разные ссылки, накладные расходы на создание MenuPresenter
по основному содержанию Presenter
может быть, и я бы пошел с решением 2 и создать только один MenuPresenterWidget
для всех основных типов контента и всегда показывать его.