IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Rafraîchissement combobox suite à un onchange="submit()"


Sujet :

JSF Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut Rafraîchissement combobox suite à un onchange="submit()"
    Bonjour à tous,

    A chaque changement de valeur d'une liste déroulante, je souhaite recharger la page. Pour cela j'utilise l'attribut onchange avec la fonction submit() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:selectOneMenu value="#{controller.object.id}" onchange="submit();" valueChangeListener="#{controller.updateValue}">
                                <f:selectItems value="#{controller.itemList}"/>
                            </h:selectOneMenu>
    Le problème est qu'aucune combobox ne prend la valeur du modèle (rafraîchissement?). J'ai fait un test en introduisant un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:commandButton action="controller.updateValue2"/>
    Et là, toutes les combos prennent les bonnes valeurs. Le rafraîchissement de la page suite à une action sur un bouton a l'air différent d'un rafraîchissement provoqué par un submit javascript. Comment palier à ce problème?
    Comment forcer le rafraîchissement d'une liste déroulante?

    J'utilise JSF 1.2 sans framework complémentaire (ex: pas de richfaces).

    Merci

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     onchange="this.form.submit();"

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    J'ai essayé et ça ne change rien

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    tu peux montrer le code de la page et de la fonction listener

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Le composant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:selectOneMenu value="#{controller.schedule.id}" onchange="submit();" valueChangeListener="#{controller.updateValue}">
          <f:selectItems value="#{controller.scheduleList}"/>
    </h:selectOneMenu>
    La méthode updateValue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void updateValue(ValueChangeEvent valueChangeEvent) {
            System.out.println(" --- updateValue --- ");
            if (valueChangeEvent.getNewValue() != null) {
                deduceInformation(new Integer(valueChangeEvent.getNewValue().toString()));
            }
        }
    La méthode deduceInformation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void deduceInformation (int scheduleId) {
            Office office = null;
            schedule = scheduleService.get(scheduleId);
            if (schedule.getItineraryList() != null && schedule.getItineraryList().size() > 0) {
                for (Itinerary eachItinerary : schedule.getItineraryList()) {
                        office = eachItinerary.getOffice();
                        if (eachItinerary.getFirstOffice() == 1) {
                            firstOffice = new Office(office.getId());
                        } else {
                            getOfficeList().add(office);
                        }
     
                }
            }
            // Refresh table
            dataModel = null;
        }
    La combo box qui ne se rafraîchit pas est bindé à l'attribut firstOffice.

    Merci Sniper37

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Sniper37, tu vois d'où peut venir le problème? Ou pas d'idée?

    Merci

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Essaie de faire un peu un truc tout con , mets un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onchange="alert(\'bonjour\')"
    pour voir si le js est bien interpreté à cet endroit. ensuite si ca marche essaie ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.forms[0].submit()
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Merci pour ta réponse DevServlet.

    Le "alert()" marche.
    document.forms[0].submit(), this.form.submit() et submit() ont le même résultat : les combobox ne se rafraîchissent pas.

    Est-il possible de provoquer la mise à jour d'une liste déroulante en javascript ou autre?

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par scorplayer Voir le message
    Merci pour ta réponse DevServlet.

    Le "alert()" marche.
    document.forms[0].submit(), this.form.submit() et submit() ont le même résultat : les combobox ne se rafraîchissent pas.

    Est-il possible de provoquer la mise à jour d'une liste déroulante en javascript ou autre?
    • le submit va surement rafraichir toute la page pas que la liste déroulante, tu peux simuler le submit avec la touche F5.
    • vérifie si tu n'a pas d'erreurs javascript, d'erreur de conversion/validation avec h:messages.
    • tu peux aussi faire un outputText avec la valeur de la liste, voir à quoi elle correspond.
    • Ton bean doit être en scope session sinon ses valeurs seront perdues à chaque requete.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    le submit va surement rafraichir toute la page pas que la liste déroulante
    On est d'accord.

    Ton bean doit être en scope session
    Mon Bean est bien en session.

    vérifie si tu n'a pas d'erreurs javascript, d'erreur de conversion/validation
    Je n'ai pas d'erreurs de conversion/validation, je vais voir pour le javascript.

    tu peux aussi faire un outputText avec la valeur de la liste, voir à quoi elle correspond
    Je vais tester ça tout de suite.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Oula, je ne comprend pas tout! D'après la trace que j'ai mis dans le getter de firstOffice (variable bindé à la combo), firstOffice est bien modifiée lors de son passage dans la méthode deduceInformation() mais quelque chose la remet à son ancienne valeur juste derrière!

  12. #12
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Est-il possible de provoquer la mise à jour d'une liste déroulante en javascript ou autre?
    Pour d'autres composants oui tout à fait, mais les listes j'ai jamais essayé, si le but de ton submit c juste rafraichir tes combo, alors essaies de générer ton code source de la page et aller dedans voir la structure DOM de l'objetcombo box généré, et essaie de le modifier avec ton javascript, c'est ce que je faisais dans certains projets et ca marchait bien.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    tu peux poster le vrai code, qui ne fonctionne pas, celui que tu as donné ne concerne pas la valeur que tu change: firstOffice.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Je te redonne (mon 3ème post) le code de la méthode deduceInformation() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void deduceInformation (int scheduleId) {
            Office office = null;
            schedule = scheduleService.get(scheduleId);
            if (schedule.getItineraryList() != null && schedule.getItineraryList().size() > 0) {
                for (Itinerary eachItinerary : schedule.getItineraryList()) {
                        office = eachItinerary.getOffice();
                        if (eachItinerary.getFirstOffice() == 1) {
                            firstOffice = new Office(office.getId());
                        } else {
                            getOfficeList().add(office);
                        }
     
                }
            }
            // Refresh table
            dataModel = null;
        }
    firstOffice intervient à la ligne 8.

  15. #15
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    la valeur du select ne peux ps prendre un objet sans lui associer un converter, si la valeur est un id, dans ta fonction tu modifie un objet.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Le composant lié à firstOffice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:outputText value="#{properties.FIRST_OFFICE}"/><br/>
    <h:selectOneMenu value="#{controller.firstOffice.id}">
         <f:selectItems value="#{controller.officeList}"/>
    </h:selectOneMenu>
    Je suis donc bindé à l'Id de l'objet (pas besoin de passer par un converter dans ce cas?). Et dans la méthode deduceInformation(), je ne modifie que l'Id aussi. L'objet est vide, seul l'Id est manipulé. C'est correct?
    C'est vrai que j'aurais pu me binder directement sur un int sans passer par l'objet. Mais là, au moins, si j'ai besoin de l'objet complet, j'ai juste à le récupérer en base grâce à son Id.

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    ton problème vient surement de là, utilise un simple Integer en value de ton selectOneMenu et à priori tout rentrera dans l'ordre

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Comment expliquer que la même chose (sans javascript) marchait avec un commandButton alors?

    Je teste avec un Integer.

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Ça ne marche pas

    Par contre peut-être une piste :
    J'ai enlevé le setter de la valiable et le outputText du test m'indique que le modèle est à la bonne valeur. Conclusion : le modèle est à la bonne valeur avant le rafraîchissement de la page; au submit du formulaire, la combo valide son contenu (pas la valeur du modèle mais l'ancienne) et écrase la bonne valeur du modèle.

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    tu peux redonner le dernier code partie JSF et partie java..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo