Как восстановить динамический идентификатор (вложенный в Datalist) в JSF / A4J? - PullRequest
1 голос
/ 20 апреля 2011

Использование jsf 1.1.11 / richfaces 3.1.5 и лицевая панель с несколькими таблицами (списки управляющих таблиц все хранятся на карте) на одной странице, каждая со своей собственной сортировкой / разбиением на страницы, которые запускают запросы ajax по щелчкам пользователя , Бин находится в области запроса. Структура страницы имеет форму:

<h:panelGroup id="allResults">
    <t:dataList id="keysItr" var="groupType" value="#{bean.tableKeys}">
        <t:dataList id="group" var="result" value="#{bean.groupResults[groupType].results}">
        ...table logic with sorting a4j commands
        </t:dataList>
        <h:panelGroup id="paginator">
        ... paginator logic from {bean.groupResults[groupType].paginator} with a4j commands
        </h:panelGroup>
    </t:dataList>
</h:panelGroup>

Так что, если я выполню любую из этих команд a4j и перезапущу allResults, она будет работать для этой конкретной таблицы, но затем, конечно, также сбросит поведение paginator / sort для всех остальных (возвращаясь к настройкам по умолчанию на странице 1, несортированный) - я хочу просто повторно визуализировать конкретную таблицу, на которую воздействует щелчок пользователя, но идентификаторы таблицы-идентификатора и dataList являются динамическими, поскольку они вложены в dataIist keysItr.

Я написал некоторый javascript вместе с функцией a4j: js, которая будет захватывать все динамически генерируемые ключи таблиц / пагинаторов при загрузке страницы (так как они просто имеют форму _container1: _containerN: rowIndexVar: id, так легко выполнить поиск их) и выбросить его в сессионный компонент и попытаться поместить эти значения идентификатора в атрибут reRender действий a4j, но ничего не запускается, так что не думаете ли вы, что a4j позволяет идентификаторам полностью определяться с именем naming_containers и всем с атрибутом reRender?

В любом случае, просто интересно, если, возможно, будет ли какой-то способ вызвать повторную визуализацию конкретной таблицы / пагинатора в компоненте поддержки, если я уже знаю идентификаторы и смогу получить компонент, который хочу. У меня есть некоторый код, который я использовал до этого, который будет рекурсивно перебирать дочерние компоненты из facecontext viewRoot, чтобы получить фактический UIComponent, на который ссылается id, но затем не знаю, что делать дальше, чтобы произошла повторная визуализация. Какие-нибудь мысли или другие подходы, которые я мог бы предпринять, чтобы заставить это работать? Спасибо.

1 Ответ

2 голосов
/ 20 апреля 2011

Динамический идентификатор компонента, сгенерированный richfaces, может быть доступен с помощью #{rich:clientId('id')}.

Например, предположим, что у вас есть

<h:form id="form">
   < rich:dataTable id="table" > 
      ..............
   </rich:dataTable>
</h:form>

.Страница JSF для доступа к динамическому идентификатору таблицы, который в этом примере получит form:table.

Затем вы можете переопределить эту таблицу в вашем a4j:command:

<a4j:commandButton .... reRender="#{rich:clientId('table')}"/>

...