2013-02-01 3 views
0

Je suis en train de trouver l'équivalent de ce code XHTML:Comment ajouter l'équivalent de f: ajax tag à une case à cocher générée dynamiquement?

<h:selectBooleanCheckbox value="#{sandboxBean.selected}" > 
    <f:ajax listener="#{sandboxBean.handleToggle}" render="outputText" /> 
</h:selectBooleanCheckbox> 

<br /><br /> 
<h:outputText value="#{sandboxBean.selected}" id="outputText"/> 

pour le cas où la case entière doit être créé dynamiquement par le backing bean. J'ai réussi à obtenir une Ajax bonté avec ce code:

checkbox = new HtmlSelectBooleanCheckbox(); 
checkbox.setId(makeCheckboxId()); 

AjaxBehavior valueChangeAction = (AjaxBehavior)FacesContext.getCurrentInstance().getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID); 

valueChangeAction.addAjaxBehaviorListener(new AjaxBehaviorListener() { 

    @Override 
    public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException { 
    System.out.println("Ajax behavior called");  
    } 
}); 

checkbox.addClientBehavior("valueChange", valueChangeAction); 

mais je ne peux pas comprendre comment obtenir l'appel Ajax pour exécuter ma méthode handleToggle, ni comment donner un accès facile aux outputText élément que je veux rendre (dans cet exemple de coupure).

En outre, cela semble étonnamment compliqué: tout cela provient d'un besoin d'une table avec un nombre inconnu de colonnes. Suis-je en train d'approcher cela fondamentalement du mauvais angle en créant toute la table dans le code?

Répondre

1

mais je ne peux pas comprendre comment obtenir l'appel Ajax pour exécuter ma méthode handleToggle

Votre code est sensible à l'environnement des bizarreries spécifiques. Les implémentations plus anciennes de Mojarra ne parviennent pas à exécuter une méthode d'écoute de comportement ajax créée par programme. Assurez-vous d'avoir la dernière version ou essayez MyFaces. Certaines implémentations EL spécifiques à un conteneur ne parviennent pas à appeler une méthode sur une classe anonyme. Vérifiez que vous utilisez la dernière version du conteneur ou extrayez-la dans une classe publique.


ni comment donner un accès facile à l'élément outputText que je veux rendre (dans cet exemple de coupe-bas)

Utilisez la méthode AjaxBehavior#setRender() pour définir l'attribut render.

ajaxBehavior.setRender(Collections.singletonList("outputText")); 

De plus, cela semble compliqué de façon inattendue: tout cela découle d'un besoin d'une table avec un nombre inconnu de colonnes. Suis-je en train d'approcher cela fondamentalement du mauvais angle en créant toute la table dans le code?

Oui. Faites-le du côté de la vue. Vous pouvez utiliser <c:forEach> pour créer dynamiquement des composants <h:column>. Ou, vous pouvez saisir par ex. PrimeFaces <p:columns>. Voir aussi par ex. Dynamically generate h:column based on list of hashmaps.

+0

Merci. Je vais essayer PrimeFaces et mettre à niveau vers une implémentation plus récente. J'avais essayé '', mais mystifyingly la balise complète a été rendue dans le HTML, plutôt qu'effectuant réellement l'action annoncée. –

+0

Peut-être avez-vous simplement oublié ou typé l'espace de noms XML taglib de JSTL? Ensuite, les balises seront en effet non analysées et apparaîtront dans le HTML rendu. L'espace de nom XML du taglib de base JSTL approprié est 'xmlns: c =" http://java.sun.com/jsp/jstl/core "'. – BalusC

+0

J'aurais juré que j'avais vérifié trois fois, mais je l'ai encore essayé et le fonctionne maintenant. Merci –

Questions connexes