gpt4 book ai didi

java - 如何更新 CheckBoxMultipleChoice 的模型?

转载 作者:行者123 更新时间:2023-12-02 02:41:54 24 4
gpt4 key购买 nike

ClassChoice 控件继承 CheckBoxMultipleChoice。它是在多个页面上使用的通用控件,并且选择保留在 session 中。可用的选择是从数据库中获得的。当存在多个数据项时,会添加“全部”复选框。在某些页面上,选择更改会导致页面刷新为新数据。在其他页面上,选择应该更改而无需刷新。

我的问题是,当其他复选框更改时,我需要控制“全部”复选框,并在“全部”复选框更改时更改所有复选框。

我尝试调用 updateModel() 来强制进行更改,但没有成功。如何在不刷新页面的情况下更改选择(model 参数)?

此编辑后的代码不显示页面刷新。

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

最佳答案

您必须使用 AjaxRequestTarget 来更新浏览器端的 HTML 元素。通过向 selection 添加/删除元素,您可以在服务器端更改 ClassChoice 的模型。在 AjaxFormChoiceComponentUpdatingBehavior#onUpdate() 的底部,您应该执行 target.add(this) 来告诉 Wicket 使用新的选择/模型重新绘制此 ClassChoice 实例。

确保在其构造函数中调用 setOutputMarkupId(true),否则您将无法使用 Ajax 更新它。

关于java - 如何更新 CheckBoxMultipleChoice 的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45314196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com