我想显示一个选项卡容器,其中每个选项卡都托管一个PresenterWidget。
选项卡是动态的 - 它们可以打开和关闭。此外,当前选定的选项卡应该以某种方式持久存在于网址,以便可以共享或添加书签。
我看到GWTP有TabContainerPresenter,但它是用来托管的每个选项卡上的演示者,而不是演示者小组件。您也无法添加选项卡是动态的,与位置的关系(当然(是静态的。
我还看到关于这个问题的几个讨论说,如果标签正在托管 PresenterWidget,不需要特殊的实现,所以我们可以使用任何选项卡容器。例如 GWT选项卡布局面板。
但是我不明白我的演示者小部件(托管在tab(生命周期将在选项卡选择时调用,或者我应该怎么做让生命周期工作(在揭示,在重置...(?
我想我必须构建自己的选项卡容器来管理可见内容通过插槽?
还有其他想法吗?
本
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 上添加一个 beforeSelect 处理程序,它可能看起来像这样:
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
}
});
希望这有帮助。
如果任何选定的选项卡应该保留在URL中,那么它是一个位置,因此应该由演示者而不是演示者小部件表示。
这是示例 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>