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.
Vous devez vous connecter pour publier un commentaire.
La
rowEdit
etcellEdit
événements fait par le design intérieur de la table, pas de mise à jour/re-rendre autre chose que la ligne actuelle, même pas lorsqu'il est explicitement spécifié dansupdate
attribut. C'est la conséquence de PrimeFaces " un peu trop zélés de tenter de réduire la taille de la réponse. Cela a un sens dans la plupart des cas, mais pas spécifiquement dans votre cas. Il vaut la peine d'une question de rapport.Dans le même temps, jusqu'à ce qu'ils résoudre ce problème, votre meilleur pari est d'utiliser
<p:remoteCommand>
d'invoquer l'souhaité méthode écouteur et d'effectuer une mise à jour complète de la table.Réécrire
à
Glassfish Server
invites erreur de méthodeis NOT FOUND
comme il est nécessaire de mentionner que cette méthode commeTim Long
dit contientCellEditEvent
param. Je voulaisupdate whole datatable
quand une cellule est édité. Pouvez-vous m'aider s'il vous plaît?cellEdit
auditeur en place, et puis juste déplacé leupdate
attribut à laremoteCommand
avec leremoteCommand
composant, essentiellement à utiliser uniquement pour effectuer laupdate
attribut j'ai été en utilisant l'ajax événement.La BaLusC solution n'a pas travaillé directement pour moi. Le onCellEdit besoin d'un CellEditEvent comme param. Ma solution est de la forme suivante:
cell
? Comment résoudre ce problème?Si aucune des solutions n'a fonctionné pour vous, cela a fonctionné pour moi
Je vais appeler la méthode du filtre sur la PF widget sur ajax, toute méthode qui ne une "reload" de la table de travail, j'ai utilisé le filtre, car ma table avait des filtres de colonne.
J'ai testé votre code. D'abord, j'ai déménagé p:commandButton de p:outputPanel. Voici code modifié:
Je pense que ce code ne fonctionne pas correctement. si vous modifiez quelque chose dans le tableau, le p:ajax chaque fois rendu complet de la table. Ainsi, la charge de programme de base de données à partir de TableBean constructeur et supprimé de nouvelles données.
Si je omettre votre p:code ajax n'est pas disparait toute les nouvelles données de l'écran. Le
refreshButton
p:commandButton fonctionner correctement.Je pense que c'est un mauvais design d'ajouter
update=":testForm:testContainer"
à ajax, parce que c'est la mise à jour de votre outputPanel plus que comme exepted (premier temps de travailler correctement, deuxième fois ne pouvait pas modifier la cellule, parce que le programme de mise à jour à plusieurs reprises au tableau).Je ne sais pas quel est votre but. Si vous voulez rendre table sans un bouton de commande, alors pourriez-vous spécifier un événement javascript ou p:message et cette disparaissent vous pouvez effectuer le rendu de la table.
Je pense que si vous omettez de mise à jour dans p:ajax ou spécifier la mise à jour d'un p:message, et déplacez p.bouton de commande de
testContainer
votre code commencer à fonctionner correctement.5 ans après, ce problème existe toujours. Malheureusement, alors que les Baukes solution est extrêmement utile et contient beaucoup d'idées, c'est encore incomplète, comme ltlBeBoy l'a déjà souligné dans son commentaire. Les modifications ultérieures apportées sans changement de conduire à des incohérences dans le tableau de l'état, lorsque plus aucune modification n'est possible. La raison en est, que le
oncomplete
à distance mise à jour vient après le mode d'édition de la nouvelle cellule est déjà activé. Si le mode d'édition de la nouvelle cellule est détruite par la mise à jour. Toutefois, la mise à jour ne peut pas être fait en Ajax auditeurtableBean#onCellEdit
, ce qui permettrait d'afficher la table, à tort, avec une cellule seule.La solution est, pour exécuter la mise à jour dans les commandes à distance de l'écouteur et que, si un changement s'imposait. Ainsi, dans
tableBean
vous de mettre en œuvre des programmes de mise à jour, une distance d'auditeur et d'un indicateur qui indique le changement:La commande à distance n'a pas de mise à jour de l'attribut plus: