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

Wicket Java Discussion :

Rafraîchir un Panel utilisant des données en session qui sont modifiées


Sujet :

Wicket Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut Rafraîchir un Panel utilisant des données en session qui sont modifiées
    Bonjour,

    J'utilise wicket depuis peu de temps. J'essaie de faire un petit prototype d'application eShop.

    J'ai créé 2 Panel réutilisables sur une page :

    Le premier contient une liste répétée de produits du catalogue avec un lien "ajouter au panier". Ce dernier lien stocke l'ID du produit cliqué en session.

    Le second quant à lui affiche brièvement la liste de produits contenus dans le panier en se basant sur l'actuel contenu du panier en session.

    Tout ceci fonctionne à un détail près, mon composant panier sur la page ne se rafraîchit pas toujours lorsque des nouveaux items sont ajoutés au panier.

    J'ai essayé de le rendre non versionné avec la propriété setVersioned(false), ça ne change rien, il se rafraîchit toujours par rapport au cache. Je ne vois pas trop comment je pourrais faire pour remédier à ce problème sans obliger mes composants à se référencer mutuellement.

    Une solution serait de forcer mon composant panier à toujours se rafraichir quoi qu'il arrive mais je ne trouve pas comment faire.

    Mon code de composant est celui-ci :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public final class BasketBox extends Panel
    {
     
        public BasketBox(String id)
        {
            super (id);
     
            this.setVersioned(false);
            final UserSession session = (UserSession) this.getSession();
     
     
     
            add( new ListView<ProductWithAttr>("itemList", session.getProductWithAttr()  ) {
     
                @Override
                protected void populateItem(ListItem<ProductWithAttr> item)
                {
     
                    ProductWithAttr prod = item.getModelObject();
     
                    item.add( new Label("name", prod.getName() ));
                    item.add( new Label("price", new DecimalFormat("#0.00").format(  prod.getPrice() ) ));
                }
            });
     
            add( new Label("total", new CompoundPropertyModel( new LoadableDetachableModel()
            {
     
                @Override
                protected Object load()
                {
                    return new DecimalFormat("#0.00").format(  session.getBasketValue()) ;
                }
     
            })));
     
        }
    }
    En gros il se renseigne sur ce qui est actuellement en session puis génère un listview. J'aurai peut être la possibilité d'utiliser une implémentation custom de IModel dans ListView, mais je sais pas trop si c'est la solution et je m'y perd un peu.

    Si quelqu'un connaît une solution propre, je suis preneur!

  2. #2
    Membre émérite

    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    bonsoir _skip

    je pense que le problème vient de la façon dont la listView est alimentée en données, à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    session.getProductWithAttr()
    En effet, la liste est alors constituée une fois pour toute à la création de la listView, ce qui ne semble pas être le but recherché, même si éventuellement la listView peut etre créée plusieurs fois au cours de la navigation.

    Passer par un LoadableDetachableModel (LDM) est éventuellement susceptible de faire l'affaire, mais je crains que non in fine : des éléments sont susceptibles d'être ajoutés en cours de RequestCycle après que le LDM se soit chargé. Du coup, je préconiserai plutot de passer par un AbstractReadOnlyModel (de même pour le label).

    Petite astuce en passant, pour éviter le cast concernant UserSession, faire dans UserSession.class la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public static UserSession getUserSession()
        {
            return (UserSession) get();
        }
    Pour éviter tout warning, on pourrait même y mettre un test via instanceof, mais ce serait excessif à mon avis

    ++
    joseph

  3. #3
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Merci pour ta réponse qui m'a beaucoup aidé.

    Je pensais qu'il fallait utiliser la méthode getSession des composants pour récupérer une session et donc je voyais pas comment toucher la session depuis le modèle (sachant que celui-ci est supposé ne pas connaître son composant).

    Mais grâce à la méthode statique que tu as proposé, j'ai pu implémenter ça proprement.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public final class BasketBox extends Panel
    {
     
     
     
        public BasketBox(String id)
        {
            super (id);
     
            this.setVersioned(false);
     
            //Create a read only model based on the basket content in session
            AbstractReadOnlyModel<List<ProductWithAttr>> productListModel = new AbstractReadOnlyModel<List<ProductWithAttr>>()
            {
                public List<ProductWithAttr> getObject()
                {
                    return UserSession.getSession().getProductWithAttr();
                }
            };
     
            //Create a read only model based on the basket value in session
            AbstractReadOnlyModel<String> totalModel = new AbstractReadOnlyModel<String>()
            {
                public String getObject()
                {
                    return new DecimalFormat("#0.00").format( UserSession.getSession().getBasketValue() ) ;
                }
            };
     
            //adds the listview component
            add( new ListView<ProductWithAttr>("itemList", productListModel  ) {
     
                @Override
                protected void populateItem(ListItem<ProductWithAttr> item)
                {
     
                    ProductWithAttr prod = item.getModelObject();
     
                    item.add( new Label("name", prod.getName() ));
                    item.add( new Label("price", new DecimalFormat("#0.00").format(  prod.getPrice() ) ));
                }
            });
     
            //adds the total label on the bottom
            add( new Label("total", totalModel  ) );
     
        }
     
    }
    Merci encore ça m'a vraiment sorti une épine du pied.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/04/2007, 12h02
  2. Réponses: 9
    Dernier message: 15/12/2006, 11h29
  3. [C#] Utilisation des données dans un Thread
    Par Seth77 dans le forum C#
    Réponses: 12
    Dernier message: 24/10/2006, 14h14
  4. Exposition d'un objet en utilisant des données externes
    Par ocroquette dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/11/2005, 21h49

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