首页 > 解决方案 > 关闭所有面板并使用 p:ajax 更新动态 p:accordionPanel

问题描述

我想关闭所有面板并更新动态PrimeFaces 8 p:accordionPanel。我尝试p:ajax onstart使用小部件 var 关闭所有面板。这确实会关闭它们,但在更新后它们会再次打开。没有dynamic="true"它确实有效(即使没有onstart)。这在 XHTML 中很容易修复,还是我在这里查看错误?

<h:form id="main">
  <p:dataTable value="#{appointments.lazy}"
               lazy="true"
               var="appo"
               rowKey="#{appo.id}"
               selectionMode="single"
               selection="#{appointments.selected}"
               rows="10">
    <p:column headerText="#{msg.date}">#{appo.startTime}</p:column>
    <p:ajax event="rowSelect"
            onstart="var a=PF('acc');for(i=0;i&lt;a.panels.length;i++){a.unselect(i)}"
            update="main:acc"/>
  </p:dataTable>

  <p:accordionPanel id="acc"
                    widgetVar="acc"
                    dynamic="true"
                    multiple="true"
                    activeIndex="">
    <p:tab title="#{now}">#{now}</p:tab>
    <p:tab title="#{now}">#{now}</p:tab>
  </p:accordionPanel>
</h:form>

标签: jsfprimefaces

解决方案


我最终在我的身上使用了一个监听器p:ajax来重置活动索引:

public void resetActivePanels() {
  org.omnifaces.util.Components
    .findComponentsInCurrentForm(AccordionPanel.class)
    .get(0)
    .setActiveIndex("");
}

这也消除了在启动时首先关闭每个面板的需要:

<p:ajax event="rowSelect"
        listener="#{appointments.resetActivePanels()}"
        update="main:acc"/>

推荐阅读