2011-06-17 2 views
0

Mon tableau de bord nécessite au moins deux clics pour mettre à jour l'un des composants CheckBoxMulitpleChoice à l'aide de la méthode onSubmit de mes boutons. Comment puis-je mettre ces composants à jour lors du premier clic? J'utilise deux composants CheckBoxMultipleChoice pour compiler une liste d'utilisateurs à notifier. Le premier est rempli en fonction des utilisateurs disponibles dans une sélection d'équipe DropDownChoice. L'utilisateur peut alors sélectionner des utilisateurs de cette équipe à ajouter au second CheckBoxMultipleChoice, qui affiche tous les utilisateurs à notifier et permet à l'utilisateur de supprimer des utilisateurs.Wicket CheckBoxMultipleChoice ne se met pas à jour

J'ai essayé d'utiliser le composant de palette, mais je suis à l'aide 1.3.1 wicket (que j'ai des problèmes de migration à 1,4, mais qui est pour un autre poste) et n'ont pas réussi à contrôler l'interface utilisateur. J'ai également essayé de placer les composants dans des formes, mais cela n'a pas changé la fonctionnalité. Il faut au moins 2 clics pour ajouter ou supprimer une entrée de la case à cocher. il semble que getValue() ne soit pas mis à jour tant que le comportement du bouton n'a pas été modifié.

 // Team selection for notification ================================= 
     final DropDownChoice teamNotificationChoice = new DropDownChoice("teamNotification", teamList, new IChoiceRenderer() { 
      public Object getDisplayValue(Object o) { 
       return ((Team) o).getName(); 
      } 
      public String getIdValue(Object o, int i) { 
       return Long.toString(((Team) o).getId()); 
      } 
     }); 
     notifySelectionList.add(teamNotificationChoice); 

     // teamUser selection list for notification ======================== 
     List<ItemUser> choices = UserUtils.convertToItemUserListFromUsers(getJtrac().findUsersForSpace(space.getId())); 
     teamUsers = new CheckBoxMultipleChoice("teamUsers", choices, new IChoiceRenderer() { 
      public Object getDisplayValue(Object o) { 
       return ((ItemUser) o).getUser().getName(); 
      } 
      public String getIdValue(Object o, int i) { 
       return ((ItemUser) o).getUser().getLoginName(); 
      } 
     }); 
     notifySelectionList.add(teamUsers); 

     // Add selected teamUsers button =================================== 
     Button button = new Button("addUsersToList") { 
      @Override 
      public void onSubmit(){ 
      } 
     }; 
     button.add(new AjaxFormComponentUpdatingBehavior("onClick") { 
      protected void onUpdate(AjaxRequestTarget target) { 
       List choices = teamUsers.getChoices(); 
       String value = teamUsers.getValue(); 
       for (int index = 0; index < choices.size(); index++) { 
        final ItemUser choice = (ItemUser) choices.get(index); 
        if(isSelected(choice, index, value)&!userSelection.contains(choice)) { 
         userSelection.add(choice); 
        } 
       } 
       SortUtils.sortItemUsers(userSelection); 
       itemUsers.setChoices(userSelection); 
       target.addComponent(itemUsers); 
      } 
     }); 
     notifySelectionList.add(button); 
     notifySelectionList.setOutputMarkupId(true); 

     // notify list =================================================== 
     itemUsers = new CheckBoxMultipleChoice("itemUsers", userSelection, new IChoiceRenderer() { 
      public Object getDisplayValue(Object o) { 
       return ((ItemUser) o).getUser().getName(); 
      } 
      public String getIdValue(Object o, int i) { 
       return ((ItemUser) o).getUser().getLoginName(); 
      } 
     }); 
     itemUsers.setMaxRows(10); 
     itemUsers.setOutputMarkupId(true); 
     notifyList.setOutputMarkupId(true); 
     notifyList.add(itemUsers); 

     // Remove selected teamUsers button =================================== 
     Button removeButton = new Button("removeUsersFromList") { 
      @Override 
      public void onSubmit(){ 
      } 
     }; 
     removeButton.add(new AjaxFormComponentUpdatingBehavior("onClick") { 
      protected void onUpdate(AjaxRequestTarget target) { 
       List choices = itemUsers.getChoices(); 
       String value = itemUsers.getValue(); 
       for (int index = 0; index < choices.size(); index++) { 
        final ItemUser choice = (ItemUser) choices.get(index); 
        if(isSelected(choice, index, value)) { 
         userSelection.remove(choice); 
        } 
       } 
       itemUsers.setChoices(userSelection); 
       target.addComponent(itemUsers); 
      } 
     }); 
     notifyList.add(removeButton); 

Nous vous remercions à l'avance pour les conseils que vous pourriez être en mesure d'offrir ...

+0

Mettez à niveau vers quelque chose de plus récent. 1.3.1 est une version très ancienne. –

+0

@ martin-g as-tu lu mon message? Le problème n'est pas lié à la version. Il a fini par être ma surutilisation de AjaxFormComponentUpdatingBehavior(). – OnesAndZeros

Répondre

1

Ok, je ne sais pas si quelqu'un se soucie, puisque je n'ai pas eu des commentaires, je suppose que ce n'est pas un problème commun, mais je vais mettre ma solution ici juste au cas où il peut aider quelqu'un.

J'ai été en mesure de le résoudre en laissant tomber le AjaxFormComponentUpdatingBehavior() et en utilisant simplement la méthode onSubmit() des boutons. Je ai également setDefaultFormProcessing(false) sur les boutons de sorte que seuls les panneaux CheckboxMultipleChoice seraient mis à jour. Il ressemble maintenant à ce qui suit:

 // Team selection for notification ================================= 
     final DropDownChoice teamNotificationChoice = new DropDownChoice("teamNotification", teamList, new IChoiceRenderer() { 
      public Object getDisplayValue(Object o) { 
       return ((Team) o).getName(); 
      } 
      public String getIdValue(Object o, int i) { 
       return Long.toString(((Team) o).getId()); 
      } 
     }); 
     notifySelectionList.add(teamNotificationChoice); 

     // teamUser selection list for notification ======================== 
     List<ItemUser> choices = UserUtils.convertToItemUserListFromUsers(getJtrac().findUsersForSpace(space.getId())); 
     teamUsers = new JtracCheckBoxMultipleChoice("teamUsers", choices, new IChoiceRenderer() { 
      public Object getDisplayValue(Object o) { 
       return ((ItemUser) o).getUser().getName(); 
      } 
      public String getIdValue(Object o, int i) { 
       return ((ItemUser) o).getUser().getLoginName(); 
      } 
     }); 
     notifySelectionList.add(teamUsers); 

     // Add selected teamUsers button =================================== 
     Button button = new Button("addUsersToList") { 
      @Override 
      public void onSubmit(){ 
       List choices = teamUsers.getChoices(); 
       String value = teamUsers.getValue(); 
       for (int index = 0; index < choices.size(); index++) { 
        final ItemUser choice = (ItemUser) choices.get(index); 
        if(isSelected(choice, index, value)&!userSelection.contains(choice)) { 
         userSelection.add(choice); 
        } 
       } 
       SortUtils.sortItemUsers(userSelection); 
       itemUsers.setChoices(userSelection); 
       notifyList.add(itemUsers); 
       teamUsers.updateModel(); 
      } 
     }; 
     button.setDefaultFormProcessing(false); 
     notifySelectionList.add(button); 
     notifySelectionList.setOutputMarkupId(true); 

     // notify list =================================================== 
     itemUsers = new JtracCheckBoxMultipleChoice("itemUsers", userSelection, new IChoiceRenderer() { 
      public Object getDisplayValue(Object o) { 
       return ((ItemUser) o).getUser().getName(); 
      } 
      public String getIdValue(Object o, int i) { 
       return ((ItemUser) o).getUser().getLoginName(); 
      } 
     }); 
     itemUsers.setMaxRows(10); 
     itemUsers.setOutputMarkupId(true); 
     notifyList.setOutputMarkupId(true); 
     notifyList.add(itemUsers); 

     // Remove selected teamUsers button =================================== 
     Button removeButton = new Button("removeUsersFromList") { 
      @Override 
      public void onSubmit(){ 
       List choices = itemUsers.getChoices(); 
       String value = itemUsers.getValue(); 
       if(value!=""){ 
        String[] valueList = itemUsers.getValue().split(";"); 
        List<User> userList = new ArrayList<User>(); 
        for (String s:valueList){ 
         userList.add(getJtrac().loadUser(s)); 
        } 
        List<ItemUser> itemUserList = UserUtils.convertToItemUserListFromUsers(userList); 
        for (ItemUser iu:itemUserList) { 
         userSelection.remove(iu); 
        } 
        itemUsers.setChoices(userSelection); 
        notifyList.add(itemUsers); 
       } 
      } 
     }; 
     removeButton.setDefaultFormProcessing(false); 
     notifyList.add(removeButton); 
+0

Merci de partager votre réponse. J'ai un problème similaire, mais est fondamentalement le CheckboxMultipleChoice n'apporte les valeurs la première fois que le bouton est cliqué, puis je montre certaines erreurs qui dépendent des valeurs sélectionnées, après correction de l'erreur, le modèle lié à l'élément CheckboxMultipleChoice ne sera pas mis à jour :( – will824

+0

@ will824 - Je ne suis pas sûr de votre configuration particulière, mais vous pouvez essayer d'effectuer un rafraîchissement ajax de votre case à cocher lorsque vous affichez les erreurs? Si vous postez votre propre question avec du code, je peux voir si j'ai des idées qui peuvent aider, merci. – OnesAndZeros