2012-03-14 47 views
0

我正嘗試在GWTP中使用雙重嵌套。 SimpleNestedSample只有1級。我想要(至少)2級。然而,我最低級別的演示者從來沒有透露過(甚至是實例化)。在ClientGinjectorBase.java我有以下幾點:使用雙重嵌套的GWTP

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

您發佈的代碼與回答您的問題無關。比方說,你有4個主持人:

  • MainPresenter
  • HeaderPresenter
  • NavigationPresenter
  • 首頁演示

MainPresenter將包含3名其他主持人。當一個地方被揭露(家)時,一個事件被解僱。

HomePresenter代碼:

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

然後此事件是由MainPageView這增加的內容,以所述槽的一個setInSlot處理。這就是爲什麼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必須實現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,所以我只放了相關代碼,您應該可以編寫缺少的代碼。

+0

不要你只是在主持人上打電話給setinslot(..),而且它做的工作? – HaveAGuess 2012-10-28 19:10:32