Основные шрифты 3.5, Mojarra 2.1.14. Это мой PF DataTable, он содержит один нередактируемый столбец булева под названием «автоматическая» и редактируемый «метка» колонок:Как обновить определенную строку в файле «Первичные»
<p:dataTable value="#{bean.contents}" paginator="true" var="row"
editable="true" editMode="cell" rows="25" rowsPerPageTemplate="10,25,50" id="list">
<p:column>
<f:facet name="header"><h:outputText value="header1" /></f:facet>
<p:selectBooleanCheckbox value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>
</p:column>
<p:column>
<f:facet name="header"><h:outputText value="header2" /></f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.label}"></h:outputText>
</f:facet>
<f:facet name="input">
<p:inputText value="#{row.label}"></p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="isAutomatic"/>
</p:dataTable>
Cell слушатель редактировать событие:
public void onEditLabel(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
if(newValue != null && !newValue.equals(oldValue)) {
DataTable s = (DataTable) event.getSource();
MyEntity d = (MyEntity) s.getRowData();
try {
d.setAutomatic(false);
myDAO.save(d);
addMessage("Change saved!");
} catch (Exception ex) {
addErrorMessage("Label could not be saved!");
getFacesContext().validationFailed();
}
}
}
Клетка редактор работает, отправляет данные слушателю, и он сохраняется в базе данных. Флаг «автоматический» также очищается при прослушивании событий редактирования ячейки и корректно сохраняется в базе данных. Проблема в том, что флажок «автоматический» не обновляется на клиенте.
Я также попытался
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>
который правильно обновил флажок, но и вызывает внимание к потере, а пропускная способность отходов.
Как я могу обновить только определенную ячейку после того, как событие cellEdit запущено?
Спасибо! Это работает, но определенно это не лучшая практика. Во-первых, я полагаюсь на конкретное соглашение об именах компонентов. Во-вторых, мой контроллер теперь содержит логику интерфейса (ID просмотра). Лучшим решением было бы добавить такую возможность в PF DataTable. Вздох. :) – rootkit
Я не совсем согласен с тобой. Базирующийся компонент тесно связан с уровнем представления (например, с помощью метода bean bean-метода прослушивания AJAX-прослушивателя). Было бы плохо, если бы вы поместили бизнес-логику в бэк-файл. Я согласен с тем, что добавление id в бэк-файл не очень приятный, но в этот момент я не вижу никакого простого решения. – partlov
Я согласен, что нет простого решения, это нужно будет сделать. Еще раз спасибо! – rootkit