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 :

Fonctionnement de l'AjaxCheckBox


Sujet :

Wicket Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Par défaut Fonctionnement de l'AjaxCheckBox
    Bonjour,

    Je cherche à mettre un peu d'Ajax dans mes formulaires. A savoir, dans ce cas je souhaite restreindre un champs de saisie dynamiquement à l'aide d'une checkBox. J'ai donc utilisé une AjaxCheckBox de la manière suivante.
    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
    import org.apache.wicket.ajax.AjaxRequestTarget;
    import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
    import org.apache.wicket.markup.html.form.CheckBox;
    import org.apache.wicket.markup.html.form.Form;
    import org.apache.wicket.markup.html.form.TextField;
    import org.apache.wicket.markup.html.panel.FeedbackPanel;
    import org.apache.wicket.markup.html.panel.Panel;
    import org.apache.wicket.model.Model;
     
    public class FindCompteForm extends Panel{
     
    	public FindCompteForm(String id){
    		super(id);
     
    		final TextField<String> nomField = new TextField<String>("nom", new Model<String>());
     
    		final CheckBox checkBox = new AjaxCheckBox("checkBox", new Model<Boolean>()) {
                		protected void onUpdate(AjaxRequestTarget target) {
                    		nomField.setEnabled(false);
                		}
           		};
     
    		Form<Object> form = new Form<Object>("form") {
    			protected void onSubmit() {
    				System.out.println("test");
    			}
    		};
     
    		add(checkBox);
    		form.add(nomField);
    		add(form);
    		add(new FeedbackPanel("feedback"));	
    	}
    }
    Ce code fonctionne mais ne fait pas ce que je recherche, car on que l'action du OnUpdate soit effective il faut que je valide mon formulaire. Je voudrais que dès que je check le champs se grise sans qu'il n'y ai de rechargement de page. Quelqu'un à déjà eu à faire ce genre de chose?

  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
    Bonjour Nico87

    En fait, lorsque tu implémentes des appels ajax, wicket te passe une instance d'AjaxRequestTarget : il faut lui indiquer les composants à redessiner côté client.

    A noter que chacun des composants indiqués devra avoir son markupId indiqué dans la page html générée. Pour réaliser cela, il faut appeler "composant.setOutputMarkupId(true);"

    Dans ton cas, cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    final TextField<String> nomField = new TextField<String>("nom", new Model<String>());
    nomField.setOutputMarkupId(true);
     
    final CheckBox checkBox = new AjaxCheckBox("checkBox", new Model<Boolean>()) {
        protected void onUpdate(AjaxRequestTarget target) {
           nomField.setEnabled(false);
           target.addComponent(nomField);
        }
    };
    De façon plus générale, tu peux aussi regarder du côté du AjaxFormValidatingBehavior afin de rendre des formulaires façon Ajax de manière simple et rapide

    NB : ta TextField a un drôle de modèle, j'espère que ce n'est que pour permettre de reproduire le problème.

    ++
    joseph

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Par défaut
    Merci pour ta réponse,

    Tes explications sont toujours très clairs et très rapides. Franchement merci. En revanche pour mon TextField je ne vois pas le problème (en même temps je ne programme pas depuis très longtemps). Je l'ai mis en FINAL pour pouvoir la réutiliser lorsque je à l'intérieurs des fonctions que je redéfini. Pour le <String> c'est Eclipse qui me l'a proposé dans un warning.
    Quant au Model<String>(); j'ai trouvai ce morceau de code sur le net et ça marche plutôt pas mal. D'après toi qu'est ce qui cloche?

  4. #4
    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
    C'est un plaisir Si à l'occasion tu vas sur la mailing list wicket, tu verras que les réponses sont encore bien plus rapides et de bien meilleures qualités. Igor & co sont vraiment d'une aide très précieuse.

    Concernant ton code, tu as mis cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final TextField<String> nomField = new TextField<String>("nom", new Model<String>());
    En fait cela te force à utiliser un nouveau modèle pour chaque composant, chaque modèle faisant ensuite référence à un object différent derrière (regarde le code de Model, il stocke tout simplement la valeur dans un type générique).

    De plus, cela risque de faire ce qu'on appelle le "session bloat" : stocker plein d'informations en session, genre des objets entiers, là où un simple identifiant aurait suffit (via le LoadableDetachableModel).

    Je te conseille de lire cet article Exploration des modèles de Wicket pour avoir un vrai topo sur le sujet.

    Les modèles Wicket sont un poil dur à appréhender, mais une fois l'apprentissage réalisé ils s'avèrent vraiment précieux. De plus, ils sont vraiment la clé permettant de faire des applications "scalable".

    n'oublie pas de marquer le topic résolu et n'hésite pas à en ouvrir un autre sur les modèles !

    ++

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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