PrimeFaces p:accordionPanel внутри пользовательского интерфейса:repeat или c:forEach

Я пытаюсь создать несколько accordionPanels. Я пытался включить этот тег внутри повторяющихся элементов (например, c:forEach). accordionPanel хорошо отображается, но я не могу переключиться с одной вкладки на другую.

Вот некоторые коды, которые я пробовал:

<ui:repeat value="#{myBackingBean.myList}" var="o">
    <p:accordionPanel dynamic="true" cache="true" multiple="true" widgetVar="accordion">
        <p:tab title="Title 1">
            #{o.data_one}
        </p:tab>
        <p:tab title="Title 2">
            #{o.data_two}
        </p:tab>
    </p:accordionPanel>
</ui:repeat>

А также

<c:forEach items"${myBackingBean.myList}" var="o">
    <p:accordionPanel dynamic="true" cache="true" multiple="true" widgetVar="accordion">
        <p:tab title="Title 1">
            #{o.data_one}
        </p:tab>
        <p:tab title="Title 2">
            #{o.data_two}
        </p:tab>
    </p:accordionPanel>
</ui:repeat>

Оба этих кода создают список accordionPanels, каждая с двумя вкладками. Но я не могу переключиться с одной вкладки на другую: если щелкнуть одну вкладку, она не открывается и не закрывается (за исключением последней accordionPanel).

Примечательно, если я поставлю два или более accordionPanelS вручную (без циклов JSF) они работают.

Также я проверил запросы, которые браузер отправляет при попытке открыть / закрыть вкладку. Запросы, которые я перехватываю:

<?xml version="1.0" encoding="utf-8"?><partial-response><changes><update id="mainForm:tabView"><![CDATA[
// something that always use the id of the HTML tag of the _last_ accordionPanel
</update></changes></partial-response>

Как я могу положить <accordionPanel> внутри <ui:repeat> или же <c:forEach> так что я все еще могу переключить accordionPanelвкладка?

1 ответ

Решение

Это проблема с widgetVar когда вы положите p:accordion в ui:repeat, он будет генерировать компоненты Accordion Panel с разными / динамическими идентификаторами, но не с разными / динамическими widgetVar когда вы явно указываете widgetVar как вы делаете в своем коде.

Который является в основном именем для Javascript Object для доступа к функциям Api на стороне клиента p:accordion,

Так что, если вы не используете это widgetVar из p:accordion где угодно, удалить widgetVar атрибут, то widgetVar будет генерироваться динамически.

Если вы все еще хотите использовать widgetVar, дайте себе динамическое имя, например:

widgetVar="accordion_#{o.data_one}" 

Примечание: я попробовал вышеупомянутую стратегию только с ui:repeat ,
Использование:Primefaces 3.5 и JSF 2.1.13 и это работает для меня.

Другие вопросы по тегам