GWTP с использованием двойного вложения - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь использовать двойное вложение в GWTP. SimpleNestedSample делает только 1 уровень. Я хочу иметь (как минимум) 2 уровня. Тем не менее, мой ведущий самого низкого уровня никогда не раскрывается (или даже не создается). В ClientGinjectorBase.java у меня есть следующее:

public interface ClientGinjectorBase extends Ginjector
{
  EventBus getEventBus();
  PlaceManager getPlaceManager();
  Provider<MainPresenter> getMainPresenter();
  AsyncProvider<DesktopPresenter> getDesktopPresenter();
  AsyncProvider<WebshopAppPresenter> getWebshopAppPresenter();
}

В моем ClientModule.java у меня есть следующее:

public class ClientModule extends AbstractPresenterModule
{
  @Override
  public void configure()
  {
    install(new DefaultModule(DesktopPlaceManager.class));
    bindConstant().annotatedWith(DefaultPlace.class).to(NameTokens.desktopPage);

    bindPresenter(
      MainPresenter.class,
      MainPresenter.MyView.class,
      MainView.class, MainPresenter.MyProxy.class);

    bindPresenter(
      DesktopPresenter.class,
      DesktopPresenter.MyView.class,
      DesktopView.class, DesktopPresenter.MyProxy.class);

    bindPresenter(
      WebshopAppPresenter.class,
      WebshopAppPresenter.MyView.class,
      WebshopAppView.class, WebshopAppPresenter.MyProxy.class);
  }
}

Возможно, что-то явно не так, но я был бы признателен за некоторые советы.

Спасибо !!

1 Ответ

1 голос
/ 15 марта 2012

Код, который вы разместили, не подходит для ответа на ваш вопрос. Допустим, у вас есть 4 докладчика:

  • MainPresenter
  • HeaderPresenter
  • NavigationPresenter
  • Home Presenter

MainPresenter будет содержать 3 других докладчиков. При обнаружении места (дома) происходит событие.

HomePresenter код:

@Override
protected void revealInParent() {
    // trigger the setInSlot of MainPageView
    RevealContentEvent.fire(this, MainPagePresenter.TYPE_SetMainContent,
            this);
}

Затем это событие обрабатывается setInSlot из MainPageView, который добавляет контент в один из слотов. Поэтому в MainPresenter должно быть 3 слота со следующим кодом:

@ContentSlot
public static final Type<RevealContentHandler< ? >> TYPE_SetMainContent = new Type<RevealContentHandler< ? >>();

@ContentSlot
public static final Type<RevealContentHandler< ? >> TYPE_SetHeaderContent = new Type<RevealContentHandler< ? >>();

@ContentSlot
public static final Type<RevealContentHandler< ? >> TYPE_SetNavigationContent = new Type<RevealContentHandler< ? >>();

private boolean headerNavigationDisplayed = false;

@Inject
public MainPagePresenter(final EventBus eventBus, final MyView view,
        final MyProxy proxy) {
    super(eventBus, view, proxy);
}

@Override
protected void revealInParent() {
    // trigger setInSlot in the RootView
    RevealRootContentEvent.fire(this, this);
}

@Override
protected void onReveal() {
    super.onReveal();
    if (!headerNavigationDisplayed) {
        // Fire this event to force reveal the header and navigation
        // presenters
        MainContentSetEvent.fire(this, "ThreePart");
        headerNavigationDisplayed = true;
    }
}

Когда раскрывается MainPagePresenter. Вызывает пользовательское событие MainContentSetEvent. У меня есть параметр, но он вам не нужен. Для обработки этого события HeaderPresenter должен реализовывать интерфейс the MainContentSetHandler`. Введите следующий код:

@Override
protected void revealInParent() {
    RevealContentEvent.fire(this, MainPagePresenter.TYPE_SetHeaderContent,
            this);
}

@ProxyEvent
@Override
public void onMainContentSet(MainContentSetEvent event) {
    forceReveal();
}

Сделайте то же самое для NavigationPresenter. Введите следующий код:

@Override
protected void revealInParent() {
        RevealContentEvent.fire(this,
                MainPagePresenter.TYPE_SetNavigationContent, this);
}

@ProxyEvent
@Override
public void onMainContentSet(MainContentSetEvent event) {
    layout = event.getLayout();
    forceReveal();
}

Со стороны вида введите следующий код в MainPageView:

@Override
public void setInSlot(Object slot, Widget content) {
    if (slot == MainPagePresenter.TYPE_SetMainContent) {
        setMainContent(content);
    } else if (slot == MainPagePresenter.TYPE_SetHeaderContent) {
        setHeaderContent(content);
    } else if (slot == MainPagePresenter.TYPE_SetNavigationContent) {
        setNavigationContent(content);
    } else {
        super.setInSlot(slot, content);
    }
}

Если вы хотите понять весь механизм, работающий в режиме отладки, вам легче понять иерархию вызовов. Я только поставил соответствующий код, так как вы знаете о SimpleNestetExample, вы сможете написать отсутствующий код.

...