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;
}
}