Comment puis-je passer la ligne sélectionnée à commandLink à l'intérieur de dataTable ou ui:repeat?
Je suis l'aide de Primefaces dans un JSF 2 de la demande. J'ai un <p:dataTable>
, et au lieu de sélectionner des lignes, je veux que l'utilisateur soit en mesure d'exécuter directement des différentes actions sur des lignes individuelles. Pour cela, j'ai plusieurs <p:commandLink>
s dans la dernière colonne.
Mon problème: comment puis-je passer une ligne de code à l'action lancé par la commande lien pour que je sache à quelle ligne pour agir sur? J'ai essayé d'utiliser un <f:attribute>
:
<p:dataTable value="#{bean.items}" var="item">
...
<p:column>
<p:commandLink actionListener="#{bean.insert}" value="insert">
<f:attribute name="id" value="#{item.id}" />
</p:commandLink>
</p:column>
</p:dataTable>
Mais il donne toujours 0 - apparemment, la ligne de la variable f
n'est pas disponible lorsque l'attribut est affiché (il fonctionne lorsque je utiliser une valeur fixe).
Quelqu'un a une autre solution?
Vous devez vous connecter pour publier un commentaire.
Quant à la cause, la
<f:attribute>
est spécifique au composant lui-même (peuplé pendant les temps de construction), de ne pas l'itération en ligne (peuplé pendant les temps de rendu).Il y a plusieurs façons d'atteindre l'exigence.
Utilisation
<f:param>
à la place. Il ajoute un paramètre de la requête.Si votre bean est la portée de la requête, laissez JSF définie par
@ManagedProperty
Ou si votre bean a une portée plus large ou si vous voulez plus de précision, la validation et la conversion, l'utilisation
<f:viewParam>
sur la vue cible, voir aussi f:viewParam vs @ManagedProperty:De toute façon, cela a l'avantage que le modèle de données n'a pas nécessairement besoin d'être conservé pour le formulaire de soumission (pour le cas que votre bean est la portée de la requête).
Utilisation
<f:setPropertyActionListener>
à la place. L'avantage est que cela supprime la nécessité d'accéder à la requête de paramètre de la carte lorsque le bean a une portée plus large que la demande portée.En combinaison avec
Il sera disponible en propriété
id
dans une méthode d'action. Cela nécessite seulement que le modèle de données est conservé pour la soumettre le formulaire de demande. Le mieux est de mettre la fève dans la vue portée par@ViewScoped
.Si votre servletcontainer prend en charge Servlet 3.0 /EL 2.2, puis il suffit de le passer comme argument d'une méthode. Cela implique aussi que le modèle de données est conservé pour la soumettre le formulaire de demande. Le mieux est de mettre la fève dans la vue portée par
@ViewScoped
.En combinaison avec:
Vous pouvez même passer la totalité de l'élément de l'objet:
avec:
Sur Servlet 2.5 conteneurs, c'est aussi possible si vous fournissez un EL de mise en œuvre qui prend en charge ce, comme JBoss EL. Pour la configuration de détails, voir cette réponse.
Lier la datatable valeur de
DataModel<E>
à la place qui encapsule les éléments.avec
(ce qui
transient
et paresseusement de son instanciation dans le getter est obligatoire lorsque vous utilisez ceci sur une vue ou une session d'étendue de haricot depuisDataModel
ne pas mettre en œuvreSerializable
)Ensuite, vous serez en mesure d'accéder à la ligne actuelle par
DataModel#getRowData()
sans passer quelque chose autour de JSF (détermine la ligne basé sur le paramètre de requête nom de l'cliqué sur commande un lien/bouton).Cela implique aussi que le modèle de données est conservé pour la soumettre le formulaire de demande. Le mieux est de mettre la fève dans la vue portée par
@ViewScoped
.Vous pouvez utiliser
Application#evaluateExpressionGet()
de programmation pour évaluer le courant#{item}
.Quel chemin choisir dépend des exigences fonctionnelles et si l'une ou l'autre offre plus d'avantages pour d'autres fins. Personnellement, je aller de l'avant avec le n ° 3 ou, lorsque vous souhaitez soutenir servlet 2.5 conteneurs ainsi, avec n ° 2.
Dans JSF 1.2 cela a été fait par
<f:setPropertyActionListener>
(au sein du commandement de la composante). En JSF 2.0 (EL 2.2 pour être précis, grâce à BalusC), il est possible de le faire comme ceci:action="${filterList.insert(f.id)}
De mon point de vue page:
backing bean
Grâce à ce site par Mkyong, la seule solution que fait travaillé pour nous faire passer un paramètre était présent
avec
Techniquement, que vous ne pouvez pas passer à la méthode elle-même directement, mais à la
JSF request parameter map
.#{param}
carte pour les demandes ultérieures, de ne pas passer un paramètre arbitraire. Votre Q&A est couvert par stackoverflow.com/questions/17734230