Начиная с версии 3.3 появились селекторы для определения контролов, которые надо обновить или запроцессить. Для реализации используется одноимённый механизм из jQuery, соответственно, здесь полный мануал к тому, какие возможности при написании селекторов нам предоставлены. Непосредственный пример для primefaces ниже.
Постановка задачи:
Есть некая таблица (или другой UINamingContainer), в которой отображаются иконки со статусами чего-либо. При этом статусы нужно обновлять, скажем, раз в 5 секунд.
Решение:
Описываем таблицу, в ней одной из колонок будет картинка со статусом (зелёная или красная).
<p:dataTable id="bigTable" var="item" value="#{myBigController.objectList}"> ... <p:column id="operationTypeIcon"> <f:facet name="header"> <h:outputText value="Статус" /> </f:facet> <p:graphicImage id="statusImage" styleClass="for-update" value="/resources/images/#{statusController.getStatusImageName(item)}"/> </p:column> ... </p:dataTable>Для автообновления будем использовать компонент primefaces p:poll. В его параметрах указывается:
- интервал, через который нужно выполнять аякс-запрос;
- метод-листенер, который нужно выполнять;
- идентификаторы компонентов, которые нужно обновить.
<p:poll interval="5" widgetVar="statusPoll" global="false" listener="#{statusController.refreshStatuses}" update="bigTable" process="@this" />И вот теперь есть возможность указать некие правила, по которым будет определено, какие компоненты надо обновлять. При этом в критериях можно оперировать и css-классами, и типами контролов.
Например:
update="@(.ui-panel :input:not(select))"Здесь мы определяем, что надо обновить все контролы с css-классом ui-panel и типом input, но не select-контролы (к последним, например, относится комбобокс).
Как это поможет нам при решении задачи?
Будем обновлять только те элементы, которые обладают css-классом for-update (не зря же я его так назвал?).
<p:poll interval="5" widgetVar="statusPoll" global="false" listener="#{statusController.refreshStatuses}" update="@(.for-update)" process="@this" />На что обратить внимание?
Есть один важный аспект, который несправедливо опускается в мануалах: у компонентов, которые должны найтись селектором, необходимо вручную проставлять идентификаторы. Если не сделать этого, то они будут генерироваться слишком поздно и primefaces не сможет подставить их в параметры аякс-запроса. Так что обратите внимание на:
<p:graphicImage id="statusImage" ...>