我有一個顯示一些選項卡的頁面。每個選項卡都包含一個手風琴。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