Закройте все развернутые строки внутри интерфейса: повторите - PullRequest
1 голос
/ 27 февраля 2012

У меня есть пользовательский интерфейс: повторение предметов аукциона внутри таблицы.Это обычная HTML-таблица, потому что когда вы нажимаете на ссылку Bid commandLink, строка открывается прямо под выбранным предметом аукциона и отображает компонент ставок.Bid commandLink использует ajax следующим образом:

<f:ajax listener="#{bean.addBidView(lot)}" render="bidView" />

addBidView обновляет карту auctionItems, и именно так открывается правильная выбранная строка.Когда пользователь снова нажимает на ту же ссылку Bid, addBidView выясняет ее и закрывает компонент назначения ставок.

Теперь предположим, что пользователь нажимает на несколько строк и открывает несколько компонентов назначения ставок.Все они открыты, но активен только один.Итак, вот мой вопрос: как получить весь цикл для рендеринга, когда я использую вышеуказанный ajax, чтобы открытие компонента назначения ставок автоматически закрывало другие открытые.(Карта предметов аукциона отражает правильный компонент ставок, но отображается только эта одна область ставок, поэтому другие не выполняются. Если я обновляю всю страницу, отображение корректно, и проблема возникает только тогда, когда яЯ использую ajax.)

Это структура элементов на странице (все это внутри h: form :)

<table id="bidstable">
    <h:panelGroup id="entireLoop">
        <ui:repeat id="repeatAuctionItems" var="auctionItem" varStatus="status" value="#{bean.auctionItems}">
            <td>... a bunch of td's with the auction item values ... and then: 
                <h:commandLink id="bid" rendered="#{some conditions}">
                    <f:ajax listener="#{bean.addBidView(auctionItem)}" render="bidView"/>
                </h:commandLink>
            </td>
        </ui:repeat>
    </h:panelGroup>
</table>

Я пробовал почти все комбинации элементовв "render" - например:

render="bidView bidsTable"

или render = "bidView bidsTable: wholeLoop: repeatateAuctionItems"

и любой другой след, который я могу придумать.Ничего не работаетЕсть идеи?

1 Ответ

2 голосов
/ 27 февраля 2012

Вы указали идентификатор клиента в атрибуте <f:ajax render>, который относительно относительно текущего компонента NamingContainer.Идентификаторы клиента, которые не начинаются с символа разделителя контейнера именования (по умолчанию :), относятся к текущему компоненту NamingContainer.<ui:repeat> является таким компонентом.Таким образом, идентификатор клиента должен ссылаться на дочернего элемента <ui:repeat>.Но компонент, на который вы пытаетесь ссылаться, на самом деле находится за пределами <ui:repeat>.Вместо этого вам нужно ссылаться на него с помощью абсолютного идентификатора клиента.

Чтобы найти абсолютный идентификатор клиента, необходимо открыть страницу в браузере, щелкните правой кнопкой мышии выполните Просмотр исходного кода , а затем найдите сгенерированный HTML-код ближайшего родительского компонента JSF за пределами <ui:repeat>, который в вашем конкретном случае является <h:panelGroup id="entireLoop">.Это будет выглядеть примерно так:

<span id="someId:possiblyOtherId:entireLoop">

Возьмите именно этот идентификатор клиента и добавьте префикс : для использования в <f:ajax render>.

<f:ajax ... render=":someId:possiblyOtherId:entireLoop" />

Если он содержит динамически сгенерированныйИдентификатор типа j_id_123, тогда вам нужно будет дать всем родительским компонентам NamingContainer, таким как <h:form>, фиксированный идентификатор, например <h:form id="someId">.

Обратите внимание, что не возможноссылаться на идентификатор клиента простого элемента HTML , например <table id="bidsTable">.Это должен быть полноценный компонент JSF, такой как <h:dataTable id="bidsTable">.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...