Странное поведение datatable после изменения значения строки на страницу в PrimeFaces - PullRequest
0 голосов
/ 28 декабря 2011

Когда я редактирую строку с помощью функции редактирования на месте PrimeFaces для таблицы, изменения не применяются.

Вот мой код:

properties.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"  
      xmlns:c="http://java.sun.com/jsp/jstl/core">

    <f:event type="javax.faces.event.PreRenderViewEvent" listener="${propertyManagedBean.preRenderView}"/>

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Properties</title>
    </h:head>

    <h:body> 
            <div id="content" class="left_content">
                <h:form>
                    <p:dataTable id="tbl" var="property" value="#{propertyManagedBean.properties}" paginator="true" rows="10" rowsPerPageTemplate="5,10,20">  

                        <p:ajax event="rowEdit" update="@this" listener="#{propertyManagedBean.propertyRowEdit}"/>

                        <f:facet name="header">  
                            Properties Manager  
                        </f:facet>   

                        <p:column headerText="Key" >                               
                            <h:outputText value="#{property.propKey}" />  
                        </p:column>  

                        <p:column headerText="Value">  
                            <p:cellEditor>
                                <f:facet name="output">  
                                    <h:outputText value="#{property.propValue}" /> 
                                </f:facet>
                                <f:facet name="input">  
                                    <p:inputText value="#{property.propValue}" style="width:100%"/>  
                                </f:facet>  
                            </p:cellEditor> 
                        </p:column>  

                        <p:column headerText="Options" style="width:15px">  
                            <p:rowEditor />  
                        </p:column> 
                    </p:dataTable>     
                </h:form>
            </div>
    </h:body>   
</html>

PropertyManagedBean.java

@ManagedBean
@SessionScoped
public class PropertyManagedBean {

    private PropertyJpaController controller;
    private List<Property> properties;

    /** Creates a new instance of propertyManagedBean */
    public PropertyManagedBean() {
        controller = new PropertyJpaController();
        extractProperties();
    }

    public void propertyRowEdit(RowEditEvent event) {
        Property prop = (Property) event.getObject();
        try {
            controller.update(prop);         
        } catch (Exception ex) {
            //TODO: Customize work with exceptions
        }
        extractProperties();
    }

    public List<Property> getProperties() {
        return properties;
    }

    public void preRenderView() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    }

    private void extractProperties() {
         properties = controller.findPropertyEntities();
    }
}

Проблема возникла после редактирования свойства в строке на странице. После изменения этой строки я получаю старые значения свойств в моей таблице.

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Я предполагаю, что в controller.update(prop) происходит исключение, которое вы не показываете, поэтому обновление фактически не происходит.

Если я быстро протестирую ваш код с помощью фиктивного Сервиса, это сработаеткак и ожидалось.

Facelet:

<!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>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Properties</title>
    </h:head>

    <h:body> 
         <h:form>
             <p:dataTable id="tbl" value="#{propertyManagedBean.properties}" var="property" paginator="true" rows="10" rowsPerPageTemplate="5,10,20">  

                 <p:ajax event="rowEdit" update="@this" listener="#{propertyManagedBean.propertyRowEdit}"/>

                 <f:facet name="header">  
                     Properties Manager  
                 </f:facet>   

                 <p:column headerText="Key" >                               
                     #{property.propKey}  
                 </p:column>  

                 <p:column headerText="Value">  
                     <p:cellEditor>
                         <f:facet name="output">  
                             #{property.propValue} 
                         </f:facet>
                         <f:facet name="input">  
                             <p:inputText value="#{property.propValue}" style="width:100%"/>  
                         </f:facet>  
                     </p:cellEditor> 
                 </p:column>  

                 <p:column headerText="Options" style="width:15px">  
                     <p:rowEditor />  
                 </p:column> 
             </p:dataTable> 
         </h:form>
    </h:body>   
</html>

Бэк-бин:

@ManagedBean
@SessionScoped
public class PropertyManagedBean {

    private PropertyJpaController controller;
    private List<Property> properties;

    public PropertyManagedBean() {
        controller = new PropertyJpaController();
        extractProperties();
    }

    public void propertyRowEdit(RowEditEvent event) {
        Property property = (Property) event.getObject();
        try {
            controller.update(property);
        } catch (Exception ex) {
            // TODO: Customize work with exceptions
        }
        extractProperties();
    }

    public List<Property> getProperties() {
        return properties;
    }

    private void extractProperties() {
        properties = controller.findPropertyEntities();
    }
}

Служба имитации:

public class PropertyJpaController {

    private List<Property> properties = new ArrayList<Property>();

    {
        properties.add(new Property("KeyA", "ValueA"));
        properties.add(new Property("KeyB", "ValueB"));
    }

    public List<Property> findPropertyEntities() {
        // Copy list and entries to prevent direct in-memory updating
        List<Property> newList = new ArrayList<Property>();
        for (Property property : properties) {
            newList.add(new Property(property.getPropKey(), property.getPropValue()));
        }

        return newList;
    }

    public void update(Property updatedProperty) {
        for (Property property : properties) {
            if (property.getPropKey().equals(updatedProperty.getPropKey())) {
                property.setPropValue(updatedProperty.getPropValue());
            }
        }
    }
}

Модель макета:

public class Property {

    private String propKey;
    private String propValue;

    public Property(String propKey, String propValue) {
        this.propKey = propKey;
        this.propValue = propValue;
    }

    public String getPropKey() {
        return propKey;
    }

    public void setPropKey(String propKey) {
        this.propKey = propKey;
    }

    public String getPropValue() {
        return propValue;
    }

    public void setPropValue(String propValue) {
        this.propValue = propValue;
    }
}

Обратите внимание, что прослушиватель событий preRenderView был довольно ненужным.Кроме того, обычно вы не сделаете бэк-компонент @SessionScoped, но в случае имитации это удобно для проверки того, что изменения действительно сохранились.

Это было протестировано, кстати, с PrimeFaces 3rc2 на JBoss AS 7.

0 голосов
/ 28 декабря 2011

Таблица данных Primefaces имеет атрибут с именем rowEditListener.Вы должны использовать этот атрибут вместо использования внутреннего компонента <p:ajax>.Это, вероятно, решит вашу проблему обновления.

<p:dataTable ... rowEditListener="#{propertyManagedBean.propertyRowEdit}">

РЕДАКТИРОВАТЬ: Похоже, что этот атрибут больше не существует в Primefaces 3.0 в соответствии с руководством пользователя.Не обращайте внимания на мой ответ, но я оставлю его, поскольку он все еще применяется к Primefaces 2.2.1 и может принести пользу кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...