2011-03-29 4 views
2

J'ai un formulaire simple avec un inputText et 2 commandButtons. L'entréeTexte affiche la valeur du bean backing correctement, mais lorsque je change la valeur pour la première fois, la méthode set n'est pas appelée, et donc le formulaire submit avec une valeur vide. Lorsque je le change à nouveau, la méthode set est appelée et tout fonctionne correctement. Quelle est la cause et comment puis-je le résoudre?<h: inputText valeur ne pas mettre à jour

<h:panelGroup id="chatId"> 
    <h:panelGrid rendered="#{chat.validUser == true}"> 
     <h:form id="sendMsgForm" > 
     <h:panelGroup id="chatId2"> 
      <h:inputText id="chatInput" value="#{chat.msgTo}" autocomplete="off" > 
      <f:ajax execute="@this @form" /> 
      </h:inputText> 
      <h:commandButton value="Send" id="sendButton" action="#{chat.send}"> 
      <f:ajax render=":chatLogId :chatId" /> 
      </h:commandButton>  
      <h:commandButton value="Bye" action="#{chat.bye}"> 
      <f:ajax render=":chatLogId :chatId :chatUserId" /> 
      </h:commandButton> 
     </h:panelGroup> 
     </h:form> 
    </h:panelGrid> 
    </h:panelGroup> 

Le support code haricot:

@SessionScoped 
public class Chat implements Serializable, ActionListener, ValueChangeListener { 
    private String msgTo = "Start typing..."; 
    private boolean validUser = false; 

    public void bye() { 
    validUser = false; 
    tc.disconnect(); 
    } 

    public void send() { 
    try { 
     tc.sendMessage(msgTo); 
     setMsgTo(""); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    // ... 

Répondre

0

Peut-être parce que vous tirez deux appels ajax en même temps avec le comportement simultané. Si vous cliquez sur le bouton sendButton, le groupe de panneaux chatId est rendu (par l'appel ajax de votre bouton de soumission) et le formulaire est exécuté (par l'appel ajax de votre champ de saisie).

Effectuez les opérations suivantes pour l'appel ajax de votre bouton Envoyer:

<h:commandButton value="Send" id="sendButton" action="#{chat.send}"> 
    <f:ajax render=":chatLogId :chatId" execute="@form"/> 
</h:commandButton> 
3

L'extrait de code par Matt Handy est la bonne solution, mais l'explication de la cause est incorrecte.

Vous avez omis l'attribut execute du <f:ajax> dans le bouton de commande. Il sera alors @this par défaut, ce qui signifie que seule la paire nom = valeur du bouton lui-même a été envoyée côté serveur (et donc seule l'action associée sera invoquée, les valeurs d'entrée ne seront pas mises à jour). Puisque vous voulez soumettre le formulaire entier à la place, vous devez définir explicitement execute à @form.

<h:commandButton value="Send" id="sendButton" action="#{chat.send}"> 
    <f:ajax execute="@form" render=":chatLogId :chatId" /> 
</h:commandButton> 

que cela fonctionne lors du changement du champ d'entrée est parce que vous avez mis execute="@form" dans le champ de saisie à la place. Les champs de saisie internes <f:ajax> seront par défaut exécutés lorsque vous modifiez la valeur. Mais dans ce cas particulier, vous n'en avez pas besoin du tout. Alors se débarrasser de celui-ci:

<h:inputText id="chatInput" value="#{chat.msgTo}" autocomplete="off" /> 
+0

Mais il change la valeur du champ d'entrée à la première et la deuxième fois. Donc, cela devrait fonctionner aux deux moments. Ou est-ce que je manque quelque chose? –

+0

Merci pour les réponses Matt et BalusC. J'ai essayé d'avoir juste f: ajax dans le commandButton, et aussi juste l'inputText, mais le comportement est toujours le même. La première fois que j'ai modifié le champ de saisie et que j'ai appuyé sur Entrée ou que j'ai cliqué sur le bouton, le champ de saisie a été réinitialisé à la valeur par défaut «Démarrer la frappe ...». La deuxième fois que j'ai changé le champ de saisie, tout a fonctionné. C'est comme si ma contribution était directe quelque part ailleurs la première fois. Merci. Binh – Binh

+0

Les modifications ont-elles été republiées sur le serveur? – BalusC

0

Vous voulez faire un suivi que la réponse à mon problème était de consolider les balises 3 forme que j'avais en deux formes. J'avais 1 formulaire pour le chatLogId, 1 pour chatId et 1 pour chatUserId. Le chatLogId est juste un dataTable, et je l'ai laissé seul. J'ai fusionné les formulaires chatId et chatUserId en un seul. Lorsque je quitte maintenant le champ inputText, setMsgTo et ensuite les méthodes d'envoi sont appelées. Pas sûr, mais je pense que mon problème pourrait être que le mauvais formulaire a été mis à jour avant. Merci pour votre aide. Binh

Questions connexes