JSF рендеринг встроенной панели списка ajax не работает - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть две панели: внешняя "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}" />
        ...
...