2010-12-01 38 views
1

Alors, laissez-moi nous montrer mes ennuis :)JSF - Deux questions sur les actions sur UIComponent

1 - Lorsque je clique sur un bouton de commande

<h:commandButton value="Somethings"> 
    <f:setPropertyActionListener target="#{bean.method}" value="some" /> 
    <f:ajax render="rendering"/> 
</h:commandButton> 

Je ne fais aucune action à le commandButton. Juste je tire l'appel d'ajax. Si j'ajoute une action sur le bouton (comme action="bean.myAction) il sera exécuté dans la phase 5 ° du cycle de vie JSF (allright, seulement si j'écris event = "action" dans le f: ajax, mais c'est par défaut). Droite? Mais le f: ajax est déclenché en cliquant sur le bouton par défaut? Parce que pour un ListBox par exemple, il est déclenché seulement si j'écris event = "change" (le même, je ne devrais pas l'écrire, parce que c'est par défaut).

2 - Lorsque je clique sur l'image

<h:graphicImage value="img/img.png" alt="img"> 
    <f:setPropertyActionListener target="#{bean.method}" value="some" /> 
    <f:ajax event="onclick" render="rendering"/> 
</h:graphicImage> 

Ce travail ne marche pas. Pourquoi?

Comme d'habitude, merci pour l'aide !!!!

Répondre

1

1 - Lorsque je clique sur un bouton de commande

Je ne fais pas une action au commandButton. Juste je tire l'appel d'ajax. Si j'ajoute une action sur le bouton (comme action = "bean.myAction) il sera executedat la phase 5 ° du cycle de vie JSF

Le f:setPropertyActionListener sera exécuté dans la 5ème étape ainsi.

(allright, seulement si j'écris event = "action" dans le f: ajax, mais c'est par défaut.) Droit? Mais le f: ajax est déclenché en cliquant sur le bouton par défaut? Parce que pour un ListBox par exemple , il est déclenché seulement si j'écris event = "change" (le même, je ne devrais pas l'écrire, parce que c'est par défaut)

Le f:ajax modifie simplement le comportement d'un envoi synchrone à un envoi asynchrone (partiel). Il le fait en générant du code JavaScript supplémentaire à l'attribut d'événement souhaité du composant parent (par exemple onclick, onchange, etc, regardez dans la sortie HTML générée dans webbrowser). Cela ne change rien au cycle de vie JSF. Seule la réponse rendue sera une réponse partielle qui est exactement la partie qui doit être mise à jour dans le (s) composant (s) avec l'ID tel que défini dans l'attribut render.


2 - Lorsque je clique sur l'image

Ce travail ne marche pas. Pourquoi?

Parce que le h:graphicImage ne prend pas en charge f:setPropertyActionListener du tout. Il ne fonctionne que dans les composants UICommand.

Vous souhaitez l'envelopper dans un h:commandLink à la place.

<h:commandLink> 
    <f:setPropertyActionListener target="#{bean.method}" value="some" /> 
    <f:ajax event="action" render="rendering"/> 
    <h:graphicImage value="img/img.png" alt="img"/> 
</h:commandLink> 

(et si le style nécessaire à la frontière/Souligné causée par élément généré <a> loin avec CSS)

+0

pour la première question: OK. Mais ce que je ne comprends toujours pas, c'est ceci: pour un ListBox, le 'f: ajax' est appelé quand le ListBox change par exemple. ('event =" change "'). Mais pour le bouton? Comment dire que lorsque vous appuyez dessus, vous devez exécuter le code dessus? C'est le comportement par défaut je pense, ou j'ai oublié quelque chose? – markzzz

+0

L'événement par défaut 'f: ajax' pour les composants' UICommand' (en fait, 'ActionSource') est' click'. Voir aussi la description de l'attribut 'event' dans le document PDL' f: ajax' que j'ai lié dans ma réponse (toutes les parties de code bleues dans ma réponse sont en fait des liens vers la documentation de référence officielle). – BalusC

+0

Uhm. Donc si j'écris moi-même 'action =" bean.myFunction "' sur 'commandButton' et que j'utilise' f: ajax event = "click" 'l'action ne sera pas exécutée? – markzzz