0

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);
  }
}

明らかに何かが間違っているかもしれませんが、いくつかのヒントをいただければ幸いです。

ありがとう!!

4

1 に答える 1

1

投稿したコードは、質問への回答には関係ありません。プレゼンターが 4 人いるとします。

  • メインプレゼンター
  • ヘッダープレゼンター
  • NavigationPresenter
  • ホームプレゼンター

には、他の 3 人のMainPresenterプレゼンターが含まれます。場所 (自宅) が明らかになると、イベントが発生します。

HomePresenterコード:

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

次に、このイベントはsetInSlotofによって処理されMainPageView、スロットの 1 つにコンテンツが追加されます。そのため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。パラメータがありますが、あなたには必要ありません。このイベントを処理するには、MainContentSetHandler` インターフェイスHeaderPresenterを実装する必要があります。the次のコードを挿入します。

@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ます。

于 2012-03-15T19:30:36.167 に答える