Jsf Primefaces编程选项卡菜单操作侦听器 背景和目的:
我想使用tabMenu,根据所选选项卡在同一页面上切换一些显示的内容。我选择tabMenu是因为它支持模型绑定,从而使我能够使用编程模型。我不想使用tabMenu进行导航,也不会再次请求当前页面。 我将我的实现放在一个复合组件(CC)中,以便在CC被重用或放在其他页面的情况下对设计部分具有灵活性。此CC的支持bean实现了ActionListener接口,该接口添加到添加到菜单模型的每个primefaces菜单项中。然后,重写方法的实现应该在后台更新模型,以便根据单击的菜单项正确显示动态内容。 在我试图使用CC的页面上,我还使用primefaces选项卡视图来分隔不同的内容。在我要使用我的CC的选项卡中,我还使用primefaces accordionPanel,其中我的CC是其中一个选项卡的内容 错误情况和预期行为: 将我的复合组件放在accordionPanel的一个选项卡中,菜单的模型就正确地构建在我的支持bean中并显示出来了。单击一个菜单项不会导致触发的操作(我可以判断,因为eclipse不会在processAction方法的断点处停止)。根据服务器日志,不会引发异常 由于menuItem具有actionListener属性,可用于服务器端回调,因此我希望使用addActionListener()方法添加到menuItem的actionListener具有相同的功能 我还尝试将CC放置在外部选项卡视图之外,得到了相同的结果 问题: 是否可以使用tabMenu实现我的目标?除了标签菜单,我还有其他选择吗?为了获得想要的行为,我必须改变什么 页面定义:Jsf Primefaces编程选项卡菜单操作侦听器 背景和目的:,jsf,primefaces,Jsf,Primefaces,我想使用tabMenu,根据所选选项卡在同一页面上切换一些显示的内容。我选择tabMenu是因为它支持模型绑定,从而使我能够使用编程模型。我不想使用tabMenu进行导航,也不会再次请求当前页面。 我将我的实现放在一个复合组件(CC)中,以便在CC被重用或放在其他页面的情况下对设计部分具有灵活性。此CC的支持bean实现了ActionListener接口,该接口添加到添加到菜单模型的每个primefaces菜单项中。然后,重写方法的实现应该在后台更新模型,以便根据单击的菜单项正确显示动态内容。
<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>
<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>
@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;
}
...
}
我尝试过primefaces版本3.4.1和3.5-SNAPSHOT,结果相同。Prolem解决了!因为我还不能回答我自己的问题,所以现在就发表这一评论。接下来会有一个正确的答案。那么,解决方案在哪里呢?