1

各タブが PresenterWidget をホストするタブ コンテナーを表示したいと考えています。

タブは動的です。開いたり閉じたりできます。さらに、現在選択されているタブは、共有またはブックマークできるように、何らかの方法で URL に永続化する必要があります。

GWTP には TabContainerPresenter があることがわかりましたが、これは PresenterWidget ではなく、各タブでプレゼンターをホストするためのものです。タブを動的に追加することもできず、場所との関係は (もちろん) 静的です。

タブが PresenterWidget をホストしている場合、特別な実装は必要ないため、そこにある任意のタブ コンテナーを使用できるという、この問題に関するいくつかの議論も見ました。たとえば、GWT TabLayoutPanel です。

しかし、PresenterWidget (タブでホストされている) ライフサイクルがタブの選択時にどのように呼び出されるか、またはライフサイクルを機能させるにはどうすればよいか (onReveal、onReset ...) がわかりません。

スロットを介して表示されるコンテンツを管理する独自のタブ コンテナーを作成する必要があると思いますか?

他のアイデアはありますか?

ベン

4

3 に答える 3

1

Ben さん、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);
        }
    }

次に、TabLayoutPanel に beforeSelection ハンドラーを追加します。これは次のようになります。

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

お役に立てれば。

于 2012-05-04T01:30:27.463 に答える
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>
于 2012-06-09T15:24:27.070 に答える
0

選択したタブのいずれかが URL で永続化される必要がある場合、それは Place であるため、PresenterWidget ではなく、Presenter で表す必要があります。

于 2012-05-03T09:24:13.807 に答える