PrimeFaces p:accordionPanel внутри пользовательского интерфейса:repeat или c:forEach
Я пытаюсь создать несколько accordionPanel
s. Я пытался включить этот тег внутри повторяющихся элементов (например, 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>
Оба этих кода создают список accordionPanel
s, каждая с двумя вкладками. Но я не могу переключиться с одной вкладки на другую: если щелкнуть одну вкладку, она не открывается и не закрывается (за исключением последней accordionPanel
).
Примечательно, если я поставлю два или более accordionPanel
S вручную (без циклов 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 и это работает для меня.