2012-05-03 16 views
1

我想顯示每個選項卡託管PresenterWidget的選項卡容器。託管動態主持人窗口小部件的選項卡容器

標籤是動態的 - 它們可以打開和關閉。 此外,當前選定的標籤應以某種方式永久保留在 網址中,以便它可以共享或添加書籤。

我看到GWTP有TabContainerPresenter,但它用於在每個選項卡上託管 Presenter,而不是PresenterWidget。您也不能動態添加 選項卡,並且與地點的關係(當然)是靜態的。

我也看到了有關此問題的幾個討論,如果標籤 託管PresenterWidget,則不需要特殊實現,因此我們可以使用任何製表符容器。例如GWT TabLayoutPanel。

但我不明白怎麼我的PresenterWidget(即在 標籤託管)的生命週期將在標籤選擇調用,或者我應該怎麼辦 有生命週期的工作(onReveal,onReset。 ..)?

我想我必須建立我自己的標籤容器,通過插槽管理可見內容 ?

還有其他想法嗎?

回答

0

如果任何選擇的選項卡應該是在URL持久那麼它是一個地方,因此應通過Presenter和不是由PresenterWidget來表示。

+0

你是對的 - 但我有相同的主持人的實例數量未知 - 在幾個選項卡中打開。所以它必須是一個PresenterWidget。至於URL的持久性 - 我認爲有父節選器(持有標籤容器,並有一個位置)來實現perpareFromRequest(),檢查一些tabId參數,並切換到相關的選項卡。 所以我仍然不明白如何在TabLayoutPanel的某些常規小部件(如TabContainerPresenter JavaDoc中編寫的)中託管PresenterWidget,並且仍然支持演示者生命週期。 –

1

本,TabContainerPresenter只適用於每個標籤都是位置的情況。至於你的問題,你只需要在每個標籤中設置相同的演示者小部件。您可能希望演示者小部件不要成爲單身人士,如果您將它們注入多個選項卡中。這是在主演示者在槽設置演示窗口小部件的一個示例:

@Override 
protected void onBind() { 
    super.onBind(); 
    setInSlot(TYPE_PermitContent, permitPresenter); 
    setInSlot(TYPE_ErpMessageContent, orgErpMessagePresenter); 
    setInSlot(TYPE_ContractDetailContent, contractDetailPresenter); 
} 

然後在視圖中,我的樣品許可證和ERP是在TabLayoutPanel選項卡:

@Override 
    public void setInSlot(Object slot, Widget content) { 
     if (content == null) return; 

     if (slot == ContractPopupWithTabPresenter.TYPE_PermitContent) { 
      permit.clear(); 
      permit.add(content); 
     } else if (slot == ContractPopupWithTabPresenter.TYPE_ErpMessageContent) { 
      erp.clear(); 
      erp.add(content); 
     } else if (slot == ContractPopupWithTabPresenter.TYPE_ContractDetailContent) { 
      contractDetail.clear(); 
      contractDetail.add(content); 
     } else { 
      super.setInSlot(slot, content); 
     } 
    } 

然後添加一個beforeSelection您的TabLayoutPanel上它可能看起來像這樣的處理程序:

tabPanel.addBeforeSelectionHandler(new BeforeSelectionHandler<Integer>() { 
     @Override 
     public void onBeforeSelection(BeforeSelectionEvent<Integer> event) { 
      //TODO: Set your presenter widget here with whatever argument it needs to populate itself 
     } 
    }); 

希望這會有所幫助。

+0

謝謝!你能舉一個你用來託管erp並允許演示者的UiBinder的例子嗎?如果他們是標籤,每個人如何擁有不同的面板?它們應該放在顯示選定標籤的同一個面板上。 –

0

下面是示例UiBinder實現,這當然是靜態實現,如果在運行時確定選項卡的數量,則需要製作自己的動態實現。

<g:PopupPanel styleName="{style.popupPanel}" modal="true"> 
     <g:HTMLPanel> 
      <g:HTMLPanel styleName="titleHeader" height="20px"> 
       <g:Label styleName="titleHeaderCaption" ui:field="titleLabel" /> 
       <g:Image styleName="titleImage" ui:field="titleCloseImage" url="{images.actionCancel.getURL}"/> 
      </g:HTMLPanel> 
      <g:CaptionPanel captionText="{lbl.contractDetails}" styleName="captionPanel_popup"> 
       <g:HTMLPanel ui:field="contractDetail"/> 
      </g:CaptionPanel> 
      <g:TabLayoutPanel ui:field="tabPanel" barUnit="PX" barHeight="30"> 
       <g:tab> 
        <g:header size="7"><b>Permit</b></g:header> 
        <g:HTMLPanel ui:field="permit"/> 
       </g:tab> 
       <g:tab> 
        <g:header size="7"><b>ERP</b></g:header> 
        <g:HTMLPanel ui:field="erp"/> 
       </g:tab> 
      </g:TabLayoutPanel> 
      <g:HTMLPanel styleName="{style.separator}"> 
       <hr/> 
      </g:HTMLPanel> 
      <g:HTMLPanel styleName="buttons"> 
       <g:Button text="{lbl.cancel}" styleName="button" ui:field="btnCancel"/> 
       <g:Button text="{lbl.submit}" styleName="button" ui:field="btnSubmit"/> 
      </g:HTMLPanel> 
     </g:HTMLPanel> 
    </g:PopupPanel> 
相關問題