Primefaces 4.0尝试调用错误的tabChange事件处理程序(TabView中的AccordionPanel)

时间:2014-03-04 11:53:30

标签: javascript jquery jsf primefaces tabs

我有一个显示一些标签的页面。每个标签都包含一个手风琴。

从技术上讲,我有一个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,tab = ....”)。

但是当我点击p:tabView > p:tab时,我得到以下异常:

 javax.el.MethodNotFoundException: Method not found: org.my.Controller@2691ab6b.onAccordionPanelTabChange(javax.faces.event.AjaxBehaviorEvent)

因此,Primefaces似乎只能为tabChange事件提供一个监听器。例外是指onAccordionPanelTabChange而不是onTabViewTabChange

当用户点击p:tabView p:tab时,是否有解决当前打开的手风琴自动关闭的原始问题?

注意:它似乎是PrimeFaces中的一个错误:https://code.google.com/p/primefaces/issues/detail?id=3876

1 个答案:

答案 0 :(得分:0)

似乎这是一个PrimeFaces错误,修正了PF&gt; = 5:https://code.google.com/p/primefaces/issues/detail?id=3876