У меня есть две панели: внешняя "external_lst_panel" и внутренняя "inner_lst_panel". Внутренний вкладывается во внешний. Проблема в том, что я не могу удалить элемент с внутренней панели. Кнопка «Удалить внутренний элемент» не работает. Если я посмотрю в сгенерированном коде (см. Ниже), то, похоже, возникла проблема с генерацией реального идентификатора («mojarra.ab (this, event, 'action', 0, 'inner_lst_panel')"). Если я жестко код
<h:commandButton
value="Remove inner item"
action="#{bean.do_delete_inner_item(mas, mav)}">
<f:ajax render="aform:j_idt13:0:inner_lst_panel" /> <!-- Hard coded!!! -->
</h:commandButton>
это работает. Что не так?
JSF 2.3.2 от https://maven.java.net/content/repositories/releases/org/glassfish/javax.faces/2.3.2/javax.faces-2.3.2.jar
Bean:
@Named
@ViewScoped
public class Bean
...
<h:form id="aform">
<h:panelGroup id="outer_lst_panel">
<ui:repeat
var="mas"
value="#{bean.mas_lst}">Outer item
<h:panelGroup id="inner_lst_panel">
<ui:repeat
var="mav"
value="#{mas.mav_lst}">Inner item
<h:commandButton
value="Remove inner item"
action="#{bean.do_delete_inner_item(mas, mav)}">
<f:ajax render="inner_lst_panel" /> <!-- Not working!!! -->
</h:commandButton>
</ui:repeat>
<h:commandButton
value="Add inner item"
action="#{bean.do_add_inner_item(mas)}">
<f:ajax render="inner_lst_panel" />
</h:commandButton>
</h:panelGroup>
<h:commandButton
value="Remove outer item"
action="#{bean.do_delete_outer_item(mas)}">
<f:ajax render="aform:outer_lst_panel" />
</h:commandButton>
</ui:repeat>
</h:panelGroup>
<h:commandButton
value="Add outer item"
action="#{bean.do_add_outer_item()}">
<f:ajax render="aform:outer_lst_panel" />
</h:commandButton>
</h:form>
Сгенерированный код:
<form
id="aform"
name="aform"
method="post"
action="test.xhtml"
enctype="application/x-www-form-urlencoded">
<input
name="aform"
value="aform"
type="hidden"> <span id="aform:outer_lst_panel"> Outer item <span
id="aform:j_idt13:0:inner_lst_panel"> Inner item <input
id="aform:j_idt13:0:j_idt35:0:j_idt31"
name="aform:j_idt13:0:j_idt35:0:j_idt31"
value="Remove inner item"
onclick="mojarra.ab(this,event,'action',0,'inner_lst_panel');return false"
type="submit"><input
id="aform:j_idt13:0:j_idt42"
name="aform:j_idt13:0:j_idt42"
value="Add inner item"
onclick="mojarra.ab(this,event,'action',0,'aform:j_idt13:0:inner_lst_panel');return false"
type="submit"></span><input
id="aform:j_idt13:0:j_idt43"
name="aform:j_idt13:0:j_idt43"
value="Remove outer item"
onclick="mojarra.ab(this,event,'action',0,'aform:outer_lst_panel');return false"
type="submit"></span><input
id="aform:j_idt44"
name="aform:j_idt44"
value="Add outer item"
onclick="mojarra.ab(this,event,'action',0,'aform:outer_lst_panel');return false"
type="submit"><input
name="javax.faces.ViewState"
id="j_id1:javax.faces.ViewState:0"
value="-2796149469970124814:8174359678892564468"
autocomplete="off"
type="hidden">
</form>
Обновление:
Нет, на мой вопрос нет ответа Как узнать идентификатор клиента компонента для обновления / рендеринга ajax? Не удается найти компонент с выражением "foo", на которое ссылается "bar"
Мне пока неясно, почему атрибут render из тега ajax не получает реальной ссылки на inner_lst_panel
с постоянным счетчиком. По моему мнению, это должно быть оказано
onclick="mojarra.ab(this,event,'action',0,'aform:j_idt13:0:inner_lst_panel')
но это не так. Становится
onclick="mojarra.ab(this,event,'action',0,'inner_lst_panel')
и это неправильно и не работает.
В качестве обходного пути (нет, я не могу использовать render="@form"
по другим причинам), я могу использовать следующее:
<h:form id="aform">
<h:panelGroup id="outer_lst_panel">
<h:panelGroup id="inner_lst_panel" binding="#{foo}">
...
<f:ajax render="#{foo.clientId}" />
...