La mise à jour de toute la <p:dataTable> sur complet de <p:ajax event=“cellEdit”>

J'ai de la difficulté à re-rendu d'un PrimeFaces Datatable une fois qu'une cellule a été édité. La modification de la valeur dans une cellule peut modifier les entrées dans les autres cellules, d'où la nécessité d'actualiser l'ensemble de la table.

Voici la JSF page:

<h:form id="testForm">
    <p:outputPanel id="testContainer">

        <p:dataTable id="testTable" value="#{tableBean.data}" var="entry" editable="true" editMode="cell">

            <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":testForm:testContainer" />

            <p:column headerText="Col1">  
                <p:cellEditor>
                    <f:facet name="output"><h:outputText value="#{entry.col1}" /></f:facet>
                    <f:facet name="input"><p:inputText value="#{entry.col1}" /></f:facet>
                </p:cellEditor> 
            </p:column>

            <p:column headerText="Col2">
                <p:cellEditor>
                    <f:facet name="output"><h:outputText value="#{entry.col2}" /></f:facet>
                    <f:facet name="input"><p:inputText value="#{entry.col2}" /></f:facet>
                </p:cellEditor>  
            </p:column>

        </p:dataTable>

        <p:commandButton id="refreshButton" value="Redisplay" update="testContainer" />

    </p:outputPanel>                                    
</h:form>

Et voici le backing bean:

@ManagedBean(name = "tableBean", eager = false)
@ViewScoped 
public class TableBean {
public TableBean() {
RowData entry = new RowData("a1", "b1");
entries.add(entry);
entry = new RowData("a2", "b2");
entries.add(entry);
entry = new RowData("a3", "b3");
entries.add(entry);
}
public class RowData {
private String col1;
private String col2;
public RowData(String col1, String col2) {
this.col1 = col1;
this.col2 = col2;
}
public String getCol1() {
return col1;
}
public void setCol1(String col1) {
this.col1 = col1;
}
public String getCol2() {
return col2;
}
public void setCol2(String col2) {
this.col2 = col2;
}
}
private ArrayList<RowData> entries = new ArrayList<RowData>();
public List<RowData> getData() {
return entries;
}
public void onCellEdit(CellEditEvent event) {
entries.get(event.getRowIndex()).setCol1("Dummy Col 1");
entries.get(event.getRowIndex()).setCol2("Dummy Col 2");        
}   
}

Lors de l'inclusion de mise à jour=":testForm:testContainer" au sein de la cellEdit AJAX cas, la modification de la valeur d'une cellule supprime la table de données sur l'écran et rend le contenu de la cellule (avec le bouton) -- je ne comprends pas pourquoi c'est. Lorsque la mise à jour de l'attribut n'est pas spécifié, la table reste sur l'écran avec la cellule active à jour, mais aucun des autres cellules sont mises à jour (comme attendu).

Le comportement désiré peut être obtenu (en non de manière automatisée) en ne spécifiant pas la mise à jour de l'attribut au sein de l'AJAX cellEdit événement et en cliquant sur le Réafficher bouton après l'édition de la valeur de la cellule. Comment puis-je le réaliser de manière automatisée, et pourquoi la mise à jour de l'attribut ne fonctionne pas comme je attendre?

Je suis à l'aide de PrimeFaces 4.0.

  • Avez-vous essayer de changer de mise à jour=":testForm:testContainer" update=":testForm:testTable" ?
  • Ont juste essayé, mais seulement de la cellule est mise à jour.
InformationsquelleAutor Franzl | 2013-10-23