我有一个显示一些选项卡的页面。每个选项卡都包含一个手风琴。Primefaces 4.0尝试调用错误的tabChange事件处理程序(TabView内的AccordionPanel)
从技术上讲,我有一个p:tabView
组件,其中包含四个p:tab
。我们称它们为p:tabView > p:tab
。在每个p:tab
里面,我有一个p:accordionPanel
。我将其称为p:accordionPanel > p:tab
。
我的问题是,当用户打开p:tabView > p:tab
的一个,然后打开p:accordionPanel > p:tab
的一个,然后点击另一个p:tabView > p:tab
,那么我不知道我怎么可以关闭(或“崩溃”)当前打开的p:accordionPanel > p:tab
。
我试图用两个onChange
事件处理程序来解决问题,但我遇到了一个我不明白的methodNotFound
异常。我的JSF代码是:
<p:tabView dynamic="true" cache="false">
<p:ajax event="tabChange" listener="#{controller.onTabViewTabChange}" update="@this" />
<p:tab title="tab 1">
<p:accordionPanel id="accordionPanelForTab1" dynamic="true" activeIndex="-"
value="#{controller.viewBeans}"
var="viewBean">
<p:ajax event="tabChange" listener="#{controller.onAccordionPanelTabChange}" update="@this" />
<p:tab title="#{viewBean.name}">
<h:outputText value="#{viewBean.name}" />
</p:tab>
</p:accordionPanel>
</p:tab>
<p:tab title="tab 2">
<p:accordionPanel id="accordionPanelForTab2" dynamic="true" activeIndex="-"
value="#{controller.viewBeans}"
var="viewBean">
...
</p:accordionPanel>
</p:tab>
...
</p:tabView>
在我的控制,我有以下事件处理程序:
public void onAccordionPanelTabChange(TabChangeEvent event) {
logger.info("onAccordionPanelTabChange, tab={}", event.getTab());
}
public void onTabViewTabChange(TabChangeEvent event) {
logger.info("onTabViewTabChange, tab={}", event.getTab());
}
当我点击p:accordionPanel > p:tab
,我在控制台中看到预期的调试消息(“onAccordionPanelTabChange,标签= ......“)。
但是,当我点击p:tabView > p:tab
,我得到以下异常:
javax.el.MethodNotFoundException: Method not found: [email protected](javax.faces.event.AjaxBehaviorEvent)
所以Primefaces似乎能只有一个侦听器tabChange
事件。例外是指onAccordionPanelTabChange
而不是onTabViewTabChange
。
当用户点击p:tabView p:tab
时,是否有解决自动关闭当前打开的手风琴的原始问题的解决方案?
注意:它似乎是在PrimeFaces一个错误:https://code.google.com/p/primefaces/issues/detail?id=3876
尝试使用TabMenu HTTP:// www.primefaces.org/showcase/ui/tabMenu.jsf 而不是TabView –
感谢您的回答,但TabMenu不是我所需要的(它重新加载页面)。 –
@ geceo-它是一个错误。尝试带有'AjaxBehaviorEvent'参数的处理程序,而不是'TabChangeEvent' – kolossus