Primefaces 3.5, Mojarra 2.1.14. To jest mój PF DataTable zawiera ona jedną nieedytowalny kolumnę logiczną nazwie 'automatyczne' i edycji 'etykieta' kolumna:Jak zaktualizować określony wiersz w Primefaces, którego 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>
komórkowych słuchacz edit event:
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();
}
}
}
Cela prace Editor, wysyła dane do detektora i jest poprawnie przechowywane w bazie danych. Flaga "automatyczna" jest również czyszczona przez detektor zdarzeń edycji komórki i zostaje poprawnie utrwalona w bazie danych. Problem polega na tym, że pole wyboru "automatyczne" nie jest aktualizowane na kliencie.
Próbowałem też
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>
które poprawnie zaktualizowane pole, ale również powoduje utratę ostrości i odpady przepustowości.
Jak mogę zaktualizować tylko określoną komórkę po uruchomieniu zdarzenia cellEdit?
Dzięki! To działa, ale zdecydowanie nie jest najlepszą praktyką. Po pierwsze, polegam na konkretnej konwencji nazewnictwa identyfikatorów komponentów. Po drugie, mój komponent bean kontrolera zawiera teraz logikę frontendową (widoki ID). Najlepszym rozwiązaniem byłoby dodanie takiej opcji do PF DataTable. Westchnienie. :) – rootkit
Nie całkowicie się z tobą zgadzam. Backing bean jest ściśle sprzężony z warstwą prezentacji (jak na przykład z metody wywołania AJAX wywołującego metodę bean backing). Byłoby źle, gdyby umieścić logikę biznesową w backingu. Zgadzam się, że umieszczenie id w podkładce nie jest bardzo przyjemne, ale w tej chwili nie widzę żadnego łatwego rozwiązania. – partlov
Zgadzam się, że nie ma łatwego rozwiązania, to będzie musiało zrobić. Dzięki jeszcze raz! – rootkit