JSF 2.0: повторный рендеринг/обновление одного элемента в пользовательском интерфейсе: повтор с использованием AJAX

Моя страница состоит из нескольких областей, которые создаются путем перебора списка элементов с использованием <ui:repeat>. Представьте себе этот упрощенный пример:

<h:form id="form">    
    <ui:repeat id="repeatContainer" var="item" value="#{testBean.items}" varStatus="status">
        <h:outputText value="#{item.title}: "/>

        <!-- I want to re-render only a single one of these fields -->
        <h:outputText id="valueContainer" value="#{item.value}"/><br/>          
    </ui:repeat>
</h:form>

Теперь я хочу повторно отобразить (только) valueContainer конкретного элемента в этом списке, используя AJAX (скажем, элемент с индексом 1). Я уже пробовал все эти комбинации без везения:

<!-- Works, but renders all items: -->
<f:ajax render=":form"/>

<!-- This is what I actually want to achieve (does not work, comp. not found): -->
<f:ajax render=":form:repeatContainer:1:valueContainer"/>

<!-- Does not work (component not found): -->
<f:ajax render=":form:repeatContainer"/>

<!-- Does not work (component not found): -->
<f:ajax render=":form:repeatContainer:1"/>

<!-- Does not work (component not found): -->
<f:ajax render=":form:1"/>

<!-- Does not work (component not found): -->
<f:ajax render=":form:1:valueContainer"/>

<!-- Does not work (no error message, but does nothing): -->
<f:ajax render=":form:repeatContainer:valueContainer"/>

Мои требования включают в себя:

  • Мне нужно идентифицировать компонент для повторного рендеринга с помощью пути с абсолютным идентификатором, потому что кнопка, запускающая обновление, находится где-то в дереве компонентов совершенно по-другому.
  • Повторный рендеринг всей страницы или формы (с использованием @all/@form) для меня бесполезен, потому что это ставит под сомнение, почему я вообще использую JSF/AJAX...
  • Мне нужно добиться того же самого с ячейками PrimeFaces <p:dataGrid> (т.е. обновить только конкретный подкомпонент конкретной ячейки), но я предполагаю, что это сводится к той же проблеме.

Я предполагаю, что должно быть простое решение для этого, которое я в настоящее время не замечаю?!


person tlind    schedule 11.01.2011    source источник


Ответы (2)


Похоже, это вызвано двумя отдельными ошибками в Mojarra 2.0.2. В следующем потоке обсуждается связанная проблема: Как ссылаться на родительский элемент dataTable в таблице данных?

В моем случае я использую PrimeFaces <p:dataGrid> вместо <h:dataTable>, но, похоже, у него те же симптомы. Ссылки просто не работают. Я предполагаю, что это связано с ошибкой в ​​UIComponent#findComponent() или в базовых методах реализации JSF.

Похоже, что на данный момент нет решения этой проблемы... за исключением ожидания исправления реализации JSF... если у кого-то еще есть дополнительные предложения, не стесняйтесь их добавлять.

person tlind    schedule 11.01.2011

Проблему можно решить, поместив форму в простую грань p:outputPanel и установив для параметра autoUpdate значение true.

person tdhlakama    schedule 09.12.2011
comment
Извините, но я не понимаю, как это отвечает на вопрос. Размещение формы в p:outputPanel не поможет обновить отдельные строки. - person sleske; 03.03.2017