2015-11-04 4 views
1

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.

enter image description here

консоли:

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-х. Ошибка?!?

enter image description here

консоли:

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. Теперь он отображается правильно. не

enter image description here

Добавление даты и не имеет проблемы, независимо от ее до/от/после позиции. Я обнаружил, что вы можете отредактировать дату, и до тех пор, пока она фактически не изменит порядок, она работает нормально. В тот момент, когда порядок изменяется, отредактированный исчезает, а один рядом с ним визуально дублируется на свое место.

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()+"]"; 
    } 
} 
+0

Я не знаю, почему это происходит, но идентификатор '' является 'entries', который упоминается в' 'в предположении что событие 'rowEdit' должно обновить всю таблицу данных, которая не соответствует действительности. Событие 'rowEdit' по умолчанию соответствует текущей редактируемой строке. Попытка обновить таблицу данных, указав ее 'id' в' 'будет просто проигнорирована.Если вам нужно обновлять всю таблицу данных каждый раз, когда отредактирована строка, лучше снимите встроенное редактирование и используйте вместо этого '''. – Tiny

+0

Интересная мысль. Я просто попытался с помощью 'update =" @ all "и' update = "@ none" 'просто обнаружить, что ничто не имеет значения. Возможно, это игнорируется. 'OnAdd' отлично справился с переупорядочением, но вы указываете, что rowEdit ведет себя по-другому. Как альтернатива, любой способ заставить его заставлять визуально меняющийся вид не визуально, а не прибегать к модели каждый раз? – AAron

+0

На данный момент я отключил сортировку для каждого добавления/редактирования и включил функцию сортировки естественных столбцов и сделал ее по умолчанию. Загрузка и обновление восстанавливают дату, так как этот сортировка по умолчанию. Если бы я мог сказать ему использовать 'sortBy' после каждого добавления/редактирования, у меня было бы все, что я хотел. – AAron

ответ

1

я столкнулся с той же проблемой.

Временное решение: определить widgetVar атрибут в <p:dataTable widgetVar="datatableVar" ...> и добавьте эту строку в конце вашей функции onRowEdit:

RequestContext.getCurrentInstance().execute("PF('datatableVar').filter()"); 

Это заставит визуализацию всей DataTable.

+0

Я надеюсь, что ваш ответ будет работать. Я отключил свой проект от JSF через несколько месяцев после этого сообщения. Я надеюсь, что мой пост будет полезен вам или кому-то еще. Благодаря! – AAron

Смежные вопросы