首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >承载dynamic presenter小部件的选项卡容器

承载dynamic presenter小部件的选项卡容器
EN

Stack Overflow用户
提问于 2012-05-03 15:17:01
回答 3查看 1.1K关注 0票数 1

我想展示一个选项卡容器,其中每个选项卡都托管一个PresenterWidget。

选项卡是动态的-可以打开和关闭。此外,当前选定的选项卡应该以某种方式持久保存在URL中,以便可以共享或添加书签。

我看到GWTP有TabContainerPresenter,但它是用来在每个选项卡上托管演示者的,而不是PresenterWidget。您也不能动态添加选项卡,与place的关系(当然)是静态的。

我还看到一些关于这个问题的讨论,他们说,如果选项卡托管PresenterWidget,就不需要特殊的实现,所以我们可以使用任何选项卡容器。例如GWT TabLayoutPanel。

但我不明白如何在选项卡选择时调用我的PresenterWidget (托管在选项卡中)生命周期,或者我应该做些什么才能让生命周期工作(onReveal、onReset...)?

我想我必须构建自己的选项卡容器,通过插槽来管理可见内容?

还有其他想法吗?

EN

回答 3

Stack Overflow用户

发布于 2012-05-04 09:30:27

本,TabContainerPresenter只有在每个标签都是一个地方的情况下才适用。至于您的问题,您只需要在每个选项卡中设置相同的presenter小部件。如果要将presenter小部件注入多个选项卡中,您可能希望它们不是单例。这是在主演示器的插槽中设置演示者小部件的示例:

代码语言:javascript
复制
@Override
protected void onBind() {
    super.onBind();
    setInSlot(TYPE_PermitContent, permitPresenter);
    setInSlot(TYPE_ErpMessageContent, orgErpMessagePresenter); 
    setInSlot(TYPE_ContractDetailContent, contractDetailPresenter);
}

然后在视图中,在我的示例许可和erp上是TabLayoutPanel中的选项卡:

代码语言:javascript
复制
@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处理程序,它可能如下所示:

代码语言:javascript
复制
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
        }
    });

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-05-03 17:24:14

如果任何选定的选项卡在URL中应该是持久的,那么它就是一个位置,因此应该由Presenter而不是PresenterWidget来表示。

票数 0
EN

Stack Overflow用户

发布于 2012-06-09 23:24:27

这是示例UiBinder实现,这当然是静态实现,如果选项卡的数量是在运行时确定的,您需要进行自己的动态实现。

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10426810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档