关闭所有面板并使用 p:ajax 更新动态 p:accordionPanel

Close all panels and update a dynamic p:accordionPanel using p:ajax

我想关闭所有面板并更新 动态 PrimeFaces 8 p:accordionPanel。我尝试使用小部件 var 关闭 p:ajax onstart 中的所有面板。这确实关闭了它们,但在更新后它们再次打开。没有 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>

我最终在 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"/>