Primefaces Datatable ne marche pas de mise à jour des lignes sélectionnées
J'ai un problème simple. J'ai un Primefaces Datatable. Lorsque l'utilisateur clique sur une ligne, je voudrais les lignes sélectionnées à la propriété dans la sauvegarde de la fève à être mis à jour. Ceci peut être réalisé si la forme de la Datatable est en est remis, mais je voudrais que cela se produise de manière asynchrone. J'ai lu les différentes questions ici sur cette question, mais n'ont toujours pas été en mesure de trouver une solution.
Voici un petit exemple pour illustrer le problème :
Test JSF Page:
<?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:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<p:dataTable var="v" value="#{test.values}" selectionMode="multiple"
selection="#{test.selectedValue}" rowKey="#{v.value}" >
<p:column headerText="Test">
<h:outputText value="#{v.value}" />
</p:column>
</p:dataTable>
</h:body>
Backing Bean:
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.stack.Stack;
@ManagedBean
@ViewScoped
public class Test
{
private Value[] selectedValues;
public List<Value> getValues()
{
List<Value> retVal = new ArrayList<Value>();
retVal.add(new Value("a"));
retVal.add(new Value("b"));
return retVal;
}
public Value[] getSelectedValues() {
return selectedValues;
}
public void setSelectedValues(Value[] selectedValues) {
this.selectedValues = selectedValues;
}
}
Et un simple POJO qu'ils utilisent:
public class Value {
private String value;
public Value(String value)
{
this.value = value;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}
Que par les réponses, j'ai mise à jour de la Table de données comme suit:
<p:dataTable id="dt" var="v" value="#{test.values}" selectionMode="multiple"
selection="#{test.selectedValues}" rowKey="#{v.value}" >
<p:column headerText="Test">
<h:outputText value="#{v.value}" />
</p:column>
<p:ajax event="rowSelect"/>
<p:ajax event="rowUnselect" />
</p:dataTable>
Ceci, cependant, ne parvient toujours pas à appeler le setter setSelectedValues(); je leur ai fait dire aussi:
<p:ajax event="rowSelect" update="@this" />
<p:ajax event="rowUnselect" update="@this" />
Et ce que la lecture lorsqu'une ligne a été cliqué. Des idées?
Oui c'est correct. La raison, je profite de cette approche est que j'ai un PrimeFaces Pile de menu. Lorsque l'utilisateur clique sur l'un des MenuItems, un ActionListener est déclenché. Lorsque j'essaie d'accéder aux lignes de la ActionListener, ils n'ont pas été encore fixé. Maintenant je suppose que vous êtes mieux cerner serait possible si il possible de soumettre le formulaire à partir de la MenuItem.
Ah bon... je vais poster une réponse de toute façon.
OriginalL'auteur user489041 | 2012-11-19
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
rowSelect
événement dans<p:ajax>
.Cela rend cependant très peu de sens dans ce contexte. Qu'elle aurait fait plus de sens si vous souhaitez mettre un hameçon
listener
ou unupdate
attribut. E. g.Si vous souhaitez crochet sur la désélection de lignes ainsi, en ajouter un autre qui s'accroche sur
rowUnselect
:Voir aussi:
<p:dataTable>
en page 145Euh, "Et ce que le setter lorsqu'une ligne a été cliqué" c'est exactement ce qu'ils sont censés faire. Mise à jour du modèle de la valeur une fois qu'ils sont (des nations unies)sélectionné. N'est-ce pas ce que vous voulez finalement? "Quand l'utilisateur clique sur une ligne, je voudrais les lignes sélectionnées à la propriété dans la sauvegarde de la fève à être mis à jour" de Quoi êtes-vous concrètement pose la question ici, alors?
Oui, c'était une faute de frappe, désolé, je l'ai changé pour getter.
De la lecture, évidemment, ne sera pas appelé ici. Il ne serait d'être appelé lors de l'affichage en a vraiment besoin. Exactement pourquoi voulez-vous un spécifique getter pour être appelé? Ce doit être votre préoccupation mineure en ACI des applications comme des accesseurs (et définition) ne sont pas censés effectuer une logique d'entreprise. Quel est le béton à l'exigence fonctionnelle? Avez-vous mis un peu de logique métier dans la lecture? Qu'est-il censé faire?
Je n'ai pas, je veux le setter pour être appelé, non de la lecture. Mais quand j'ai essayer la solution avec de l'ajax balises, et cliquez sur une ligne, le getter est appelé, non pas le setter.
OriginalL'auteur BalusC
Juste ajouter
<p:ajax event="rowSelect" />
à l'intérieur de votre datatableCela appel setSelectedEntity() dans le backing bean, de sorte que vous avez défini lors de l'actionListener feux
Ceci est utile si vous voulez appeler un actionListener de l'extérieur de la datatable formulaire (qui ne se soumettent pas la valeur)
OriginalL'auteur Eugenio Cuevas
Je crois que votre déclaration "Œuvres lors de la soumission de la forme" est la solution.
J'ai eu un problème similaire où ma page a plusieurs panneaux, le premier tableau est une liste de personnes, une fois que quelqu'un est sélectionné, les détails sont chargés dans les panneaux suivants.
Donc mon rowSelect auditeur le tir, mais mon haricot toujours eu null pour ma sélection. Pour info, mon rowSelect Auditeur met à jour un p:outputPanel qui s'enroule mes panneaux de détail. Mes panneaux de détail sont seulement rendus lors de la sélection n'est pas null.
Je vient de terminer la datatable avec un h:forme et tout a commencé à travailler, juste en sélectionnant une ligne.
Maintenant, j'ai utilisé du Printemps, de la Session d'Étendue de Composant pour mon de la fève à la maison de la liste de données et la sélection et le Printemps Composant singleton pour mon contrôleur pour la rowSelect opération. Mais il doit encore travailler pour votre exemple.
OriginalL'auteur sscalley
Enlever le h:outputText étiquette, d'utilisation, comme suit
OriginalL'auteur Amarnath