У меня есть p:accordionPanel
, который представляет список элементов, и на каждой вкладке есть форма. При подаче любой из повторяющихся форм возможно, что дополнительные данные необходимы, а именно, когда вызывается p:dialog
, предлагая пользователю ввести еще несколько данных. Этот диалог определяется вне панели аккордеона, потому что, в отличие от элементов из аккордеона, только один из них может отображаться одновременно, поэтому нет необходимости увеличивать HTML, повторяя его на каждой вкладке аккордеона.Как обновить компоненты AJAX на одной вкладке p: accordionPanel снаружи?
Определение аккордеона выглядит следующим образом (упрощенный, но со всеми соответствующими дескрипторами):
<p:accordionPanel id="myAccordion" value="#{managedBean.getAccordionList}" var="item" multiple="false" dynamic="true" cache="true">
<p:ajax event="tabChange" listener="#{managedBean.processTabChange}"/>
<p:tab title="#{item.tabTitle}" id="itemTab">
<h:form id="itemForm">
<h:outputLabel for="itemName" value="Item Name:"/>
<p:inputText id="itemName" title="Item Name:"
maxlength="16" value="#{appeal.itemName}">
</p:inputText>
Следовательно, HTML-визуализации для itemName
является myAccordion:0:itemForm:itemName
в первую очередь, myAccordion:1:itemForm:itemName
в секунду и т.д.
диалог определяется следующим образом:
<p:dialog id="commentDialogID" header="Enter comment" widgetVar="commentDialog" modal="true" resizable="true" height="auto">
<h:form id="commentForm">
<h:outputLabel for="comment" value="Comment:"/>
<p:inputTextarea id="comment" title="Comment"
rows="6" cols="33"
value="#{managedBean.activeItem.comment}"
required="true">
<f:ajax render="comment"/>
</p:inputTextarea>
<h:commandButton value="Submit" action="#{managedBean.proceed}" onclick="PF('commentDialog').hide();">
<f:ajax render="*** ??? ***"/>
</h:commandButton>
</h:form>
</p:dialog>
То, что я повторил ly failing at - попытки f:ajax
обновить только одну вкладку на панели аккордеона, активную, из которой был выведен диалог. Я попытался с помощью
:myAccordion:#{managedBean.activeItem.displayIndex}:itemForm:itemName
:myAccordion:#{managedBean.activeItem.displayIndex}:itemForm
:myAccordion:#{managedBean.activeItem.displayIndex}:itemTab
вместо *** ??? ***
, но ни один из них не будет составлять:
javax.faces.FacesException: <f:ajax> contains an unknown id ':myAccordion:0:itemForm' - cannot locate it in the context of the component j_idt20
Если я пропускаю индекс маркера (например, :myAccordion:itemForm:itemName
) это компилировать, но он не делает ничего функционально. Класс сущности Item
имеет getDisplayIndex
, который точно возвращает индекс активной вкладки.
Моя проблема очень похожа на то, что описано в this question, что действительно не имеет хорошего ответа. Это может быть ограничение PrimeFaces
?
«Это может быть ограничение PrimeFaces?» Я бы сказал, нет. Это не имеет никакого смысла. – DavidS
Я имел в виду ошибку, @DavidS – amphibient
Одна вещь, которая мне интересна, - это то, что визуализируется для 'f: ajax'. Вы говорите, что пытаетесь использовать 'displayIndex' в атрибуте' render', но сам 'f: ajax' отображается только один раз. Например, для аналогичного примера со статической панелью аккордеона кнопка ajax отображается как «onclick =» mojarra.ab (это событие, «действие», 0, «форма: myaccordion: mytab2»), возвращает false «' , Может быть, вы уже учли это? – DavidS