DataTable
действительно обновляет, но не отображает список правильно. (JSF 2.2, Mojarra 2.2.0, PrimeFaces 5.2)Прямоугольник рендеринга PrimeFaces DataTable неправильно после сортировки слушателя (ошибка?)
У меня есть список дат в PrimeFaces DataTable
, что я переупорядочиваю каждый раз, когда пользователь добавляет или редактирует дату. Это почти прекрасно работает. Пожалуйста, помогите мне понять, что я делаю неправильно, или дайте мне знать, что я нашел ошибку. (Обратите внимание, что его не в update
цель, так как я попытался с помощью update="@all"
, который ничего не меняет.)
Попробуйте это мой код ниже:
1) Добавить 11/21/2015 затем добавить 11/20/2015. Обратите внимание, что они переупорядочивают их onAdd
.
консоли:
onAdd, after
DataTableEntry[Date:Fri Nov 20 00:00:00 EST 2015]
DataTableEntry[Date:Sat Nov 21 00:00:00 EST 2015]
2) Затем измените 11/21/2015 изменить его на 11/19/2015. Обратите внимание, что отредактированный человек ушел, и теперь есть два 20-х. Ошибка?!?
консоли:
onRowEdit, before
DataTableEntry[Date:Fri Nov 20 00:00:00 EST 2015]
DataTableEntry[Date:Thu Nov 19 00:00:00 EST 2015]
onRowEdit, after
DataTableEntry[Date:Thu Nov 19 00:00:00 EST 2015]
DataTableEntry[Date:Fri Nov 20 00:00:00 EST 2015]
3) Затем нажмите мой "Обновить страницу" CommandButton. Теперь он отображается правильно. не
Добавление даты и не имеет проблемы, независимо от ее до/от/после позиции. Я обнаружил, что вы можете отредактировать дату, и до тех пор, пока она фактически не изменит порядок, она работает нормально. В тот момент, когда порядок изменяется, отредактированный исчезает, а один рядом с ним визуально дублируется на свое место.
datatablesort.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
>
<h:head>
<title><ui:insert name="title">DataTable</ui:insert></title>
</h:head>
<h:body>
<h:form id="modelerForm">
<p:commandButton value="Refresh page" ajax="false"/>
<h:outputLabel for="date" value="Date"/>
<h:panelGroup>
<p:calendar id="date" pattern="MM/dd/yyyy" placeholder="mm/dd/yyyy" mask="true" showOn="button" navigator="true"/>
<h:commandButton value="Add">
<f:ajax event="action" listener="#{dataTableBean.onAdd}" execute="date" render="entries"/>
</h:commandButton>
</h:panelGroup>
<p:dataTable id="entries" value="#{dataTableBean.entries}" var="entry" emptyMessage="No dates added" editable="true" tableStyle="width:auto">
<p:ajax event="rowEdit" listener="#{dataTableBean.onRowEdit}" update="entries"/>
<p:column headerText="Dates">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{entry.date}">
<f:convertDateTime pattern="MM/dd/yyyy" />
</h:outputText>
</f:facet>
<f:facet name="input">
<p:calendar id="date" value="#{entry.date}" pattern="MM/dd/yyyy" placeholder="mm/dd/yyyy" mask="true" showOn="button" navigator="true"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<p:rowEditor/>
</p:column>
<p:column>
<p:commandLink title="Remove date">
<h:outputText value="" styleClass="ui-icon ui-icon-trash"/>
<f:ajax event="click" listener="#{dataTableBean.entries.remove(entry)}" render="entries"/>
</p:commandLink>
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
DataTableBean.java
package com.aadhoc.test;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.event.AjaxBehaviorEvent;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.RowEditEvent;
@ManagedBean(name="dataTableBean")
@SessionScoped
public class DataTableBean {
private List<DataTableEntry> entries = new ArrayList<>();
public List<DataTableEntry> getEntries() {
return entries;
}
public void setEntries(List<DataTableEntry> entries) {
this.entries = entries;
}
public void onAdd(AjaxBehaviorEvent event) {
DumpList("onAdd, before");
UIComponent component = event.getComponent();
UIComponent dateComp = component.findComponent("date");
Date date = (Date) ((UIInput)dateComp).getValue();
DataTableEntry entry = new DataTableEntry();
entry.setDate(date);
getEntries().add(entry);
sortEntries(getEntries());
DumpList("onAdd, after");
}
public void onRowEdit(RowEditEvent event) {
DumpList("onRowEdit, before");
// Get entries via DataTable#getValue because in real code
// I don't have direct access to entries.
DataTable dt = (DataTable) event.getSource();
@SuppressWarnings("unchecked")
List<DataTableEntry> entries = (List<DataTableEntry>) dt.getValue();
sortEntries(entries);
DumpList("onRowEdit, after");
}
private void DumpList(String msg) {
System.out.println(msg);
for (DataTableEntry entry : entries) {
System.out.println(entry);
}
}
private <T> void sortEntries(List<DataTableEntry> entries) {
entries.sort(new Comparator<DataTableEntry>() {
@Override
public int compare(DataTableEntry entry1, DataTableEntry entry2) {
return entry1.getDate().compareTo(entry2.getDate());
}
});
}
}
DataTableEntry.java
package com.aadhoc.test;
import java.io.Serializable;
import java.util.Date;
public class DataTableEntry implements Serializable {
private static final long serialVersionUID = -2513940455250513641L;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String toString() {
return getClass().getSimpleName()+"[Date:"+getDate()+"]";
}
}
Я не знаю, почему это происходит, но идентификатор '' является 'entries', который упоминается в' 'в предположении что событие 'rowEdit' должно обновить всю таблицу данных, которая не соответствует действительности. Событие 'rowEdit' по умолчанию соответствует текущей редактируемой строке. Попытка обновить таблицу данных, указав ее 'id' в' 'будет просто проигнорирована.Если вам нужно обновлять всю таблицу данных каждый раз, когда отредактирована строка, лучше снимите встроенное редактирование и используйте вместо этого '''. –
Tiny
Интересная мысль. Я просто попытался с помощью 'update =" @ all "и' update = "@ none" 'просто обнаружить, что ничто не имеет значения. Возможно, это игнорируется. 'OnAdd' отлично справился с переупорядочением, но вы указываете, что rowEdit ведет себя по-другому. Как альтернатива, любой способ заставить его заставлять визуально меняющийся вид не визуально, а не прибегать к модели каждый раз? – AAron
На данный момент я отключил сортировку для каждого добавления/редактирования и включил функцию сортировки естественных столбцов и сделал ее по умолчанию. Загрузка и обновление восстанавливают дату, так как этот сортировка по умолчанию. Если бы я мог сказать ему использовать 'sortBy' после каждого добавления/редактирования, у меня было бы все, что я хотел. – AAron