我想使用tabMenu根据所选标签切换同一页面上的某些显示内容。我选择了tabMenu,因为它支持模型绑定,因此我可以使用编程模型。我不想使用tabMenu进行导航,也不要再次请求当前页面。 我将我的实现放入一个复合组件(CC)中,以便在CC被重用或放在其他页面上时灵活设计部分。我的这个CC的支持bean实现了ActionListener接口,该接口被添加到添加到菜单模型的每个primefaces menuItem中。然后,被覆盖方法的实现应该在后台更新模型,以便根据点击的menuItem正确显示动态内容。 在页面上我试图使用我的CC我也使用primefaces tabView来分隔不同的内容。在我想要使用CC的选项卡中,我也使用了primefaces accordionPanel,其中我的CC是其中一个标签的内容。
将我的复合组件放在我的页面上的一个accordionPanel选项卡中,菜单的模型正确地构建在我的支持bean中并显示。单击一个菜单项不会导致触发操作(我可以告诉,因为eclipse不会在我的processAction方法中的断点处停止)。根据服务器日志,不会抛出任何异常。
由于menuItem有一个可用于服务器端回调的actionListener属性,我希望我使用addActionListener()方法添加到menuItem的ActionListener具有相同的功能。
我还试图将我的CC置于外部tabView之外,结果相同。
是否有可能通过tabMenu来实现我打算做的事情?除了tabMenu,我还有其他选择吗?为了获得理想的行为,我需要改变什么?
页面定义:
<p:tabView id="someTabViewId">
<p:tab id="tabViewsFirstTab>
<p:accordionPanel id="accordionPanelId" multiple="true" cache="false">
<p:tab id="someTab1Id" title="someTab1Title">
... someTab1 content here ...
</p:tab>
<p:tab id="ccTab" title="ccTabTitle">
<ccNameSpace:ccComponentName id="ccId" />
</p:tab>
<p:tab id="someTab2Id" title="someTab2Title">
... someTab2 content here ...
</p:tab>
</p:accordionPanel>
</p:tab>
</p:tabView>
CC定义:
<composite:interface>
</composite:interface>
<composite:implementation xmlns:anotherCCNameSpace="http://java.sun.com/jsf/composite/components/someEntity/someSpecialContent">
<h:panelGrid style="width:100%;">
<p:tabMenu id="test1" model="#{ccBean.tabMenuModel}" />
<anotherCCNameSpace:specialComponent id="test" />
</h:panelGrid>
</composite:implementation>
Bean定义:
@Named
@ViewScoped
public class CcBean implements ActionListener, SomeCustomInterface {
private MenuModel menuModel;
...
@Override
public void processAction(ActionEvent event) throws AbortProcessingException {
this.doSomePreparations(event);
}
@PostConstruct
public void postConstruct() {
this.menuModel = new DefaultMenuModel();
for (SomeGroupEntity groupEntity : this.getAllSomeGroupEntities()) {
MenuItem menuItem = new MenuItem();
menuItem.setId("menuItem" + groupEntity.getId());
menuItem.setUpdate("test1 test");
menuItem.addActionListener(this);
menuItem.setImmediate(true);
menuItem.setValue(groupEntity.getName());
this.menuModel.addMenuItem(menuItem);
}
}
public MenuModel getTabMenuModel() {
return this.menuModel;
}
...
}