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 个演示者:

  • 主讲者
  • 标题演示者
  • 导航演示者
  • 主播

MainPresenter包含其他 3 位演示者。当一个地方(家)被揭示时,就会触发一个事件。

HomePresenter代码:

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

然后处理此事件setInSlotMainPageView其中将内容添加到插槽之一。这就是为什么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必须实现theMainContentSetHandler` 接口。输入以下代码:

@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 回答