PrimeFaces DataTable удаляется при использовании paginator
Я пытаюсь перенести свое WebApp из IceFaces 3.3.0 в PrimeFaces 6.1, и с некоторыми хитрыми изменениями в IceFaces я запустил оба с JSF 2.2 на WildFly. Или, по крайней мере, это похоже на работу.
Моя единственная проблема в настоящее время - с нумератором таблиц DataTable. Когда я меняю страницу (следующая страница или ссылка на страницу, это не имеет значения), весь DataTable удаляется из представления. Запуск нового Lifecylce приведет к повторному отображению таблицы данных на правильной странице.
На самом деле на стороне клиента он делает именно то, что сервер говорит ему делать. Класс DOMPartialRenderCallback объекта IceFaces обрабатывает запрос и начинает кодировать дерево компонентов. Это вызывает метод encodeEnd() объекта DataTableRenderer:
public void encodeEnd(FacesContext context, UIComponent component) throws IOException{
DataTable table = (DataTable) component;
if(table.shouldEncodeFeature(context)) {
for(Iterator<DataTableFeature> it = DataTable.FEATURES.values().iterator(); it.hasNext();) {
DataTableFeature feature = it.next();
if(feature.shouldEncode(context, table)) {
feature.encode(context, this, table);
}
}
}
else {
preRender(context, table);
encodeMarkup(context, table);
encodeScript(context, table);
}
context.getApplication().publishEvent(context, PostRenderEvent.class, table);
}
В условии if он проверяет наличие uglobal:systemMessages:systemMessageTableValues_encodeFeature
параметр, который будет true
если я использую paginator и false
для не-AJAX-запросов (или не существует). В другом случае все работает отлично, но в противном случае он не будет отображать реальную таблицу, только текущую страницу. Поэтому, когда IceFaces пытается вычислить разницу, он не находит таблицу с id="systemMessageTableValues"
и вещи, которые он удаляет и говорит клиенту, чтобы удалить его тоже.
На самом деле я понятия не имею, почему IceFaces обрабатывает запрос, хотя на текущей странице нет компонента IceFaces (на других страницах есть компоненты IceFaces). Тем не менее, я хотел бы знать, почему PrimeFaces не рендерит всю таблицу и как я могу это исправить.
dataTable.xhtml:
<p:dataTable width="100%" id="systemMessageTableValues" dataLocale="en_US"
value="#{systemMessages.dataModel}" var="item" rows="16"
style="margin:0px;" paginator="true" paginatorPosition="top"
lazy="true"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks}{NextPageLink} {LastPageLink}">
... some columns ...
</p:dataTable>