2017-07-25 1 views
0

Das Steuerelement ClassChoice erbt CheckBoxMultipleChoice. Es ist ein allgemeines Steuerelement, das auf mehreren Seiten mit in der Sitzung beibehaltenen Auswahlen verwendet wird. Die verfügbaren Auswahlmöglichkeiten werden von der Datenbank erhalten. Das Kontrollkästchen "Alle" wird hinzugefügt, wenn mehr als ein Datenelement vorhanden ist. Auf einigen Seiten führt eine Auswahländerung dazu, dass die Seite mit neuen Daten aktualisiert wird. Auf einer anderen Seite sollten sich die Auswahlen ohne eine Aktualisierung ändern.Wie aktualisiert man das Modell für eine CheckBoxMultipleChoice?

Mein Problem ist, dass ich das Kontrollkästchen "Alle" steuern muss, wenn andere Kontrollkästchen ändern und alle Kontrollkästchen ändern, wenn das Kontrollkästchen "Alle" ändert.

Ich versuchte updateModel() aufzurufen, um eine Änderung zu erzwingen, aber das hat nicht funktioniert. Wie kann ich die Auswahl ändern (model Parameter), ohne die Seite zu aktualisieren?

Dieser bearbeitete Code zeigt die Aktualisierung der Seite nicht an.

public class ClassChoice<T> extends CheckBoxMultipleChoice 
{ 
    private static final long serialVersionUID = 1L; 

    @SpringBean 
    private ClassService classService; 

    List<EntityClassModel> selection; 
    EntityClassModel ecmAll; 

    static List<EntityClassModel> availableClasses; 

    public ClassChoice(..) 
    { 
     super("classcheckboxes"); 

     setSuffix(" "); // sets checkbox separator and ensures inline display 

     ecmAll = (EntityClassModel) modelFactory.getNewClassModel(); 
     ecmAll.setClassname("All"); 

     // List of all classes associated with user 
     availableClasses = classService.getListOfClasses(..); 
     setClassChoices(); 

     add(new AjaxFormChoiceComponentUpdatingBehavior() 
     { 
      private static final long serialVersionUID = 1L; 

      @Override 
      protected void onUpdate(AjaxRequestTarget target) 
      { 
       List<Integer> previousIDs = UserSession.get().getSelectedClassIDs(); 
       if ((previousIDs.size() > 0) && ((previousIDs.size() + 1) >= availableClasses.size())) 
       { 
        // Was previously Select All 
        if (selection.get(selection.size() - 1) == ecmAll) 
        { 
         // Select All still selected, remove it 
         selection.remove(selection.size() - 1); 
        } 
        else 
        { 
         // Remove all selections 
         selection.clear(); 
        } 
       } 
       else if (selection.size() > 0) 
       { 
        // Was none or some selected 
        if (selection.get(selection.size() - 1) == ecmAll) 
        { 
         // Select All, select all available 
         selection.clear(); 
         selection.addAll(availableClasses); 
        } 
        else if ((selection.size() + 1) >= availableClasses.size()) 
        { 
         // Is now full, add Select All 
         selection.add(ecmAll); 
        } 
        // else change but no special handling required 
       } 
       // else none are currently selected 

       UserSession.get().setSelectedClasses(selection); 

       // Generate a list of selected class IDs, excluding All 
       List<Integer> selectedIDs = new ArrayList<Integer>(); 
       int copysize = selection.size(); 
       if ((copysize > 0) && (selection.get(copysize - 1) == ecmAll)) 
       { 
        copysize--; 
       } 
       for (int index = 0; index < copysize; index++) 
       { 
        selectedIDs.add(selection.get(index).getId()); 
       } 
       UserSession.get().setSelectedClassIDs(selectedIDs); 

       // Update the selections on the page 
       updateModel(); 
      }     
     }); 
     Initialize(); 
    } 

    @SuppressWarnings("unchecked") 
    protected void Initialize() 
    { 
     // Grabs already selected classes from UserSession 
     List<Integer> selectedIDs = UserSession.get().getSelectedClassIDs(); 
     selection = classService.getClassesByClassIDs(selectedIDs); 
     if (selectedIDs.size() > 1) 
     { 
      if ((selectedIDs.size() + 1) >= availableClasses.size()) 
      { 
       selection.add(ecmAll); 
      } 
     } 
     setModel(Model.ofList(selection)); 

     // Configure the data and display 
     setChoiceRenderer(new ChoiceRenderer<EntityClassModel>("classname", "id")); 
     setOutputMarkupId(true); 
    } 

    @SuppressWarnings("unchecked") 
    public void setClassChoices() 
    { 
     // Adds 'All' option when there is more than one class 
     if (availableClasses.size() > 1) 
     { 
      availableClasses.add(ecmAll); 
     } 
     setChoices(availableClasses); 

    } 

    public List<EntityClassModel> getSelection() 
    { 
     return selection; 
    } 
} 

Antwort

2

Sie müssen das AjaxRequestTarget verwenden, um das HTML-Element auf der Browserseite zu aktualisieren. Durch Hinzufügen/Entfernen von Elementen zu selection ändern Sie das Modell ClassChoice auf der Serverseite. Am unteren Ende von AjaxFormChoiceComponentUpdatingBehavior # onUpdate() sollten Sie target.add(this) tun, um Wicket mitzuteilen, diese ClassChoice-Instanz mit ihrer neuen Auswahl/ihrem neuen Modell neu zu zeichnen.

Stellen Sie sicher, dass Sie setOutputMarkupId(true) in seinem Konstruktor aufrufen, da Sie andernfalls nicht mit Ajax aktualisieren können.

Verwandte Themen