2014-01-21 3 views
0

Добрый день,ConfirmDialog предотвращает DataTable из PAGINATION в Primefaces

Я использую столбец в DataTable, который содержит кнопку действия, чтобы удалить эту запись. Когда нажата кнопка действия, отображается диалоговое окно подтверждения, в котором пользователь может отменить или удалить запись. Когда запись удаляется, разбиение на страницы больше не работает. Я могу воспроизвести это поведение с PF 4.0, а также с фактически снимком из Google Co PF 5. Вот очень простой пример, чтобы воспроизвести:

CategoryController.java

@Named 
@ViewScoped 
public class CategoryController { 

    private Entity category; 
    private List<Entity> categories; 

    public CategoryController() { 
    categories = new ArrayList<>(); 

    for (int i = 0; i < 100; i++) { 
     Entity newTest = new Entity(i); 
     categories.add(newTest); 
    } 

    } 
    public void removeCategory(){ 
    categories.remove(category); 
    } 

    public Entity getCategory() { 
    return category; 
    } 

    public void setCategory(Entity category) { 
    this.category = category; 
    } 


    public List<Entity> getCategories() { 
    return categories; 
    } 

    public void setCategories(List<Entity> categories) { 
    this.categories = categories; 
    } 
} 

Entity.java

import java.io.Serializable; 

public class Entity implements Serializable { 
    private static final long serialVersionUID = 4544407140706106480L; 
    long id; 

    Entity(long id) { 
    this.id = id; 
    } 

    public long getId() { 
    return id; 
    } 

    public void setId(long id) { 
    this.id = id; 
    } 

    @Override 
    public boolean equals(Object o) { 
    if (id != ((Entity)o).id) return false; 

    return true; 
    } 

    @Override 
    public int hashCode() { 
    return (int) (id^(id >>> 32)); 
    } 
} 

text.xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!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:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <f:view> 
     <h:form id="form"> 
      <p:panel header="#{langRes['setupCategories.pageTitle']}" style="height: 540px;" id="categoryTablePanel"> 
       <!-- category table --> 
       <p:dataTable value="#{categoryController.categories}" var="category" 
          rows="10" id="categoryTable" emptyMessage="#{langRes['setupCategories.emptyTable']}" 
          paginator="true" paginatorPosition="top"> 
        <!-- category id column --> 
        <p:column headerText="#{langRes['setupCategories.idEntry']}" id="idColumn" width="90%"> 
         <p:outputLabel id="categoryId" value="#{category.id}"/> 
        </p:column> 

        <p:column headerText="#{langRes['setupCategories.idEntry']}" id="editColumn" width="10%"> 
         <p:commandButton value="Delete" oncomplete="PF('confirmDialog').show()"> 
          <f:setPropertyActionListener value="#{category}" target="#{categoryController.category}"/> 
         </p:commandButton> 
        </p:column> 
       </p:dataTable> 
      </p:panel> 
      <p:confirmDialog global="true" widgetVar="confirmDialog" id="confirmationDialog"> 
       <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" 
           action="#{categoryController.removeCategory}" 
           update=":setupCategoryForm:categoryTable" 
           onclick="PF('confirmDialog').hide();"/> 
       <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close"/> 
      </p:confirmDialog> 
     </h:form> 
    </f:view> 
</h:body> 
</html> 

Я делаю что-то неправильно, или это ошибка? Заранее спасибо за вашу помощь !

+0

ViewScoped использует аннотацию CDI или JSF? @ javax.faces.view или @ javax.faces.bean? – perissf

+0

CDI Bean with @ javax.faces.view – VWeber

ответ

0

Я не рекомендую использовать confirmaDialog, потому что вы определяете его как глобальный.

Я всегда реализует подтверждение, как это:

Перед непосредственной форме:

<p:confirmDialog global="true" showEffect="fade" hideEffect="explode"> 
     <p:commandButton value="Si" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check"/> 
     <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close"/>  
    </p:confirmDialog> 

Кнопка внутри DataTable:

<p:commandButton id="EliminarRegistro" update=":form:mainDataTable,:form:growl" process="mainDataTable" 
         icon="ui-icon-closethick" title="Eliminar" disabled="#{!aiCarreraBean.permisosCrud.eliminar}" 
         actionListener="#{aiCarreraBean.eliminarEvent}" 
         onclick="selectCurrentRow_paginator(dt,#{rowIndex})" > 
         <p:confirm header="Confirmación" message="¿Seguro desea eliminar el registro?" icon="ui-icon-alert" /> 
        </p:commandButton> 

Javascript класса, если таблица является переменной виджета таблицы;

function selectCurrentRow_paginator(table,index){ 

table.unselectAllRows(); 
table.selectRow(index-(table.paginator.cfg.page*table.paginator.cfg.rows) ,false); 
//table.selectRow(index ,false); 

} 

Надеюсь, вы решите свою проблему. С уважением.

+0

Спасибо за ваш ответ! Но как вы получаете выбранную запись? Вы не можете использовать PropertyActionListener? – VWeber

+0

Да! Вы можете использовать PropertyActionListener (лучше всего для вашего дела, я думаю), но это моя собственная реализация, когда я выбираю строку, когда я нажимал эту кнопку с помощью функции js: –

+0

Кажется, что это проблема с Primefaces 5 ... Datatable and CommandButton больше не работает. – VWeber