2010-10-06 14 views
0

Considérons ce code simple:Ne peut pas définir un événement et lier un <a4j: support /> sur cet événement en même temps

<h:form id="myForm"> 
    <h:inputText id="myInput"> 
     <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/> 
    </h:inputText> 
</h:form> 

cela va générer le code HTML suivant:

<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="A4J.AJAX.Submit(...)" /> 

maintenant, je viens d'ajouter quelque chose dans le cas de mon onchange<h:inputText>:

<h:form id="myForm"> 
    <h:inputText id="myInput" onchange="alert('foobar');"> 
     <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/> 
    </h:inputText> 
</h:form> 

Cela GENERAT e le code HTML suivant:

<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar');" /> 

Comme vous pouvez le voir, le code Ajax est pas ajouté plus. C'est un comportement vraiment étrange en ce qui me concerne. Pourquoi le <a4j:support> ne joint pas l'appel Ajax si l'événement est déjà défini dans le champ de saisie?

Donc, ma question est comment faire le <a4j:support> de travail sur un event qui est déjà défini dans le input? Bien sûr, la solution doit exécuter à la fois le code Javascript défini en onchangeet l'appel Ajax.

En d'autres termes, je voudrais avoir le code HTML suivant:

<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar'); A4J.AJAX.Submit(...)" /> 

J'utilise RichFaces 3.3.2 et JSF 1,2


EDIT

Bien sûr, je peux déplacer le onchange Javascript code dans l'attribut onsubmit du <a4j:support>, faire quelque chose comme ça:

<h:inputText id="myInput"> 
    <a4j:support onsubmit="alert('foobar');" event="onchange" actionListener="#{myBean.doSomething}"/> 
</h:inputText> 

Mais est-ce la seule façon ??

Répondre

0

En savoir plus sur le contexte

En fait, je ne peux pas modifier vraiment la valeur event du <a4j:support>, comme suggesteed par Abel Morelos, parce que ce que je suis en train de faire est d'ajouter un composant personnalisé qui exécutent une validation côté client. Cette validation appelle une fonction Javascript, mon composant personnalisé modifie donc la valeur onchange de son parent.

Mon code JSF ressemble:

<h:inputText id="myInput"> 
    <my:validation .../> 
    <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/> 
</h:inputText> 

Ce code est tout à fait équivalent au code suivant, sauf que le onchange du <h:inputText> est ajouté automatiquement par mon composant:

<h:inputText id="myInput" onchange="if (!checkSomeValidation()) { return false; }"> 
    <a4j:support event="onchange" actionListener="#{myBean.doSomething}"/> 
</h:inputText> 

Alors comme vous pouvez le comprendre, mon composant personnalisé modifie directement l'événement onchange du <h:inputText>, et en raison du problème avec <a4j:support>, l'appel Ajax est pas lié au composant d'entrée à la fin.


La solution

lorsqu'il est lié à un composant JSF, le <a4j:support> va se "transformer" à une facette, dont le nom est org.ajax4jsf.ajax.SUPPORTxxx, où xxx est le nom event. Donc dans mon cas, le <h:inputText> aura une facette nommée org.ajax4jsf.ajax.SUPPORTonchange.

Donc ce que je fais dans mon code Java de mon composant personnalisé, est de vérifier si le parent (le <h:inputText> ici), a une telle facette.

Si aucun, cela signifie que le parent n'a aucun <a4j:support event="onchange"/> lié à lui. Donc dans ce cas, je modifie le mon <h:inputText/> attribut onchange

Si oui , cela signifie qu'il ya un <a4j:support event="onchange"/> lié au parent. Donc, je modifie la facette lui-même en utilisant le code suivant:

HtmlAjaxSupport facet = (HtmlAjaxSupport) getParent().getFacet("org.ajax4jsf.ajax.SUPPORTonchange"); 
if (facet != null) { 
    facet.setOnsubmit("my Javascript code goes here"); 
} else { 
    getParent().setOnchange("my Javascript goes here"); 
} 
1

Si ce comportement n'est pas explicitement documenté, je considérerais cela comme un bug dans Ajax4jsf. Rapportez-le à Ajax4jsf/RichFaces là-bas à JBoss.org. J'ai seen problèmes comme ça avant avec <a4j:commandButton onclick="someFunction()">

+0

J'ai créé un fil sur le forum RichFaces, au moins pour comprendre si ce comportement est le comportement attendu de l'équipe RF ... – romaintaz

1

J'ai déjà eu ce problème auparavant, et j'ai trouvé que RichFaces 3.3.x n'exécutera que le code pour l'événement onchange défini avec a4j: support et ignorera le code onchange défini avec le composant JSF. Dans mon cas la solution de contournement était simple, pour mon cas il était valide d'utiliser un autre événement au lieu de "onchange" (je ne sais pas si c'était onclick ou onselect), donc j'ai attaché mon code à cet autre événement et mon code travaillé, mais je ne suis pas sûr si cela pourrait fonctionner pour vous. Si vous avez vraiment besoin de l'événement onchange pour les deux éléments, vous devrez faire comme BalusC et le rapporter aux gens de RichFaces.

+0

Ceci est un possible solution, mais dans mon cas, ce n'est pas applicable (voir ma * réponse * pour comprendre pourquoi). – romaintaz