2014-03-04 28 views
1

我有一个显示一些选项卡的页面。每个选项卡都包含一个手风琴。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

+0

尝试使用TabMenu HTTP:// www.primefaces.org/showcase/ui/tabMenu.jsf 而不是TabView –

+0

感谢您的回答,但TabMenu不是我所需要的(它重新加载页面)。 –

+0

@ geceo-它是一个错误。尝试带有'AjaxBehaviorEvent'参数的处理程序,而不是'TabChangeEvent' – kolossus

回答

相关问题