J'ai un auditeur ajax qui devrait rediriger vers la page de vue d'élément. Cependant, comme j'utilise un type générique comme modèle, je voudrais spécifier en plus dans mon contrôleur datatable commun quelle est la vue avec un deuxième paramètre.
Malheureusement, on peut choisir entre deux approches d'écoute, l'une en utilisant event , paramètre facilitant l'identification de l'objet, et la seconde vous donnant la possibilité d'envoyer param mais sans l'événement.
template :
<p:dataTable value="#{aObj.objList}" var="item" .... selectionMode="single">
<p:ajax event="rowSelect" listener="#{aObj.viewItem}" />
<p:ajax event="rowSelect" listener="#{aObj.viewItem('myItemView?_id=')}" />
...
</p:dataTable>
contrôleur :
public void viewItem(SelectEvent event) {
// ...
}
public void viewItem(String viewUrl) {
// ...
}
Je peux ajouter des propriétés supplémentaires au bean, mais comme il est générique et que fournir des éléments de modèle ne donne pas l'impression de le polluer.
Y at-il une solution de contournement?
Vous pouvez définir un attribut dans votre table de données et le lire dans votre écouteur sélectionné. Pour ce faire, utilisez <f:attribute name="..." value="..."/>
. De la documentation :
Contraintes
Doit être imbriqué dans une action personnalisée
UIComponent
.La description
Localisez l'instance d'action personnalisée
UIComponent
du parent le plus proche (...). Si le composant associé a déjà un attribut de composant Portant ce nom, ne faites aucune action. Sinon, appelez la méthodeisLiteralText()
sur l'argumentvalue
. Si Renvoietrue
, enregistrez la valeur dans la carte attributaire du composant sous le nom dérivé ci-dessus. Si elle renvoiefalse
, stockez LaValueExpression
dans la mappeValueExpression
du composant sous le nom dérivé ci-dessus.
Donc, en prenant l’attribut que vous avez essayé de définir dans votre commentaire, vous devriez l’utiliser comme ceci:
XHTML:
<p:dataTable value="#{aObj.objList}" var="item" .... selectionMode="single">
<f:attribute name="test" value="abc" />
<p:ajax event="rowSelect" listener="#{aObj.viewItem}" />
...
</p:dataTable>
Auditeur:
public void viewItem(SelectEvent event) {
String test = (String) event.getComponent().getAttributes().get("test");
// ...
}
Lorsque vous souhaitez ajouter des paramètres de requête, spécifiques à la balise Ajax, vous pouvez utiliser la méthode onstart:
<p:ajax onstart="cfg.ext.params.Push({name: 'name', value: 'value'});"/>
Habituellement, vous devez résoudre les paramètres à l'aide du modèle.