web-dev-qa-db-fra.com

Envoyer un paramètre supplémentaire à l'écouteur d'événements Ajax

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?

6
kidwon

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éthode isLiteralText() sur l'argument value. Si Renvoie true, enregistrez la valeur dans la carte attributaire du composant sous le nom dérivé ci-dessus. Si elle renvoie false, stockez La ValueExpression dans la mappe ValueExpression 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");
  // ...
}
18
Jasper de Vries

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.

2
Tires