2010-11-24 38 views
9

De quelle manière est-ce que je peux créer une case à cocher automatiquement soumettre le formulaire auquel il appartient dans Wicket? Je ne veux pas inclure de bouton de soumission. La case à cocher est sauvegardée par un champ booléen dans un objet de domaine ("Compte" dans ce cas).Case à cocher Wicket qui soumet automatiquement sa valeur modifiée à l'objet de domaine

Exemple simplifié avec des pièces non pertinentes omis:

EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id); 

PropertyModel<Boolean> model = new PropertyModel<Boolean>(accModel, "enabled"); 
CheckBox checkBox = new CheckBox("cb", model); 
Form form = new Form("form"); 
form.add(checkBox); 
add(form); 

HTML:

<form wicket:id="form" id="form" action=""> 
    <input wicket:id="cb" type="checkbox" /> 
</form> 

Modifier: Pour clarifier, mon objectif est juste de changer le champ de l'objet de domaine (-> dans la base de données aussi) lorsque la case à cocher est activée. Tout moyen (propre, facile) d'y parvenir serait acceptable. (Je ne sais pas si vous avez besoin en fait la forme pour cela.)

Répondre

17

Juste prépondérants wantOnSelectionChangedNotifications() pour la case à cocher — même sans écraser OnSelectionChanged() — semble faire ce que je veux.

De cette façon, vous n'avez pas besoin de la forme sur le côté Java, de sorte que le code ci-dessus deviendrait:

EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id); 

add(new CheckBox("cb", new PropertyModel<Boolean>(accModel, "enabled")){ 
    protected boolean wantOnSelectionChangedNotifications() { 
     return true; 
    } 
}); 

Ne hésitez pas à ajouter de meilleures solutions, ou une meilleure explication de ce qui se passe avec cette approche!

Modifier: En regardant de plus près, je suppose que the method's Javadoc il est assez clair pourquoi ce fait ce que je voulais (Souligné par l'auteur):

Si cela est vrai, un aller-retour sera généré à chaque changement de sélection , entraînant la mise à jour du modèle (de seulement ce composant ) et onSelectionChanged étant appelé.

+1

C'est exactement le cas d'utilisation de wantOnSelectionChangedNotifications. (+1) –

9

Bien que cela puisse fonctionner, il est préférable d'utiliser AjaxCheckBox. Une sous-classe anonyme peut être câblée pour recevoir des événements immédiatement et apporter des modifications à l'interface utilisateur en dehors de la case elle-même.

final WebMarkupContainer wmc = new WebMarkupContainer("wmc"); 
final EntityModel<Account> accModel = new EntityModel<Account>(Account.class, id); 
wmc.setVisible(false); 
wmc.setOutputMarkupPlaceholderTag(true); 
form.add(new AjaxCheckBox("cb", new PropertyModel<Boolean>(accModel, "enabled")) { 
    @Override 
    protected void onUpdate(AjaxRequestTarget target) { 
     wmc.setVisible(accModel.isEnabled()); 
     target.addComponent(wmc); 
     // .. more code to write the entity 
    } 
}); 

utilisées dans cet exemple, le WebMarkupContainer serait rendu visible en phase avec la valeur de la case à cocher.

+0

Merci (+1)! Bien que je ne l'achète pas que c'est * toujours * "bien mieux", c'est souvent le cas (j'ai déjà trouvé de tels endroits dans mon projet actuel). Un inconvénient à AjaxCheckBox semble être la nécessité de mettre à jour "manuellement" l'objet domaine, tandis que dans la [approche CheckBox simple] (http://stackoverflow.com/questions/4265432/wicket-checkbox-that-automatically-submits-its -changed-value-to-domain-object/4265701 # 4265701) le PropertyModel rend cela automatique. (Intéressant qu'un PropertyModel similaire soit nécessaire ici, mais ce n'est pas suffisant.) – Jonik

+0

Je pense que cette solution est la plus utile. La majorité des fois AJAX est utilisé avec le guichet, et c'était exactement ce que je cherchais! Merci +1 – eaglei22