【发布时间】:2016-05-10 09:35:21
【问题描述】:
我有一个带有 CheckGroup 的简单面板(面板本身是更大形式的一部分)。检查组中的复选框在列表视图组件中生成。我需要动态更改此面板,每次更改时我都需要检索所选项目。面板的代码基本上是这样的:
CheckGroup<MyObject> group = new CheckGroup<MyObject>(ID, selectedObjects);
ListView<MyObject> objectList = new ListView<MyObject>(ID, values) {
@Override
protected void populateItem(ListItem<MyObject> item) {
Check<MyObject> check = new Check<MyObject>(TIME_CHECK, item.getModel());
Label l = new Label(TIME_LABEL, item.getModel());
item.add(check);
item.add(l);
}
}
group.add(objectList);
group.add(new AjaxFormChoiceComponentUpdatingBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
System.out.println("Selected objects: "+selectedObjects.size());
}
});
add(group);
现在,问题是,每当我单击复选框时,两个相同的对象都会添加到selectedObjects 列表中。如果我删除 AjaxFormChoiceComponentUpdatingBehavior,则不会将任何对象添加到列表中(这是有道理的,因为此时我没有提交表单)。
我不确定如何解决这个问题,我想出的最佳解决方案是获取列表并通过它,消除重复。
另外,很抱歉标题,但我不知道如何命名这个问题。
这里有一个小例子来说明问题: 假设检查组正在显示这些对象:
object 1
object 2
object 3
object 4
object 5
然后当我选择object 1 时,检查组(=selectedObjects)的模型将如下所示:
object 1
object 1
【问题讨论】:
-
您正在向您的组添加新的 AjaxFormChoiceComponentUpdatingBehavior(),但如果它存在,它将引发错误。您可以尝试 group.addOrReplace(...) 或者在重复视图上添加 AjaxForm(即 objectlist,并使用子 id 或其他东西)
-
很遗憾,addOrReplace() 方法只能用于组件,不能用于行为。而且由于要更新的模型(selectedObjects)在CheckGroup中,所以更新行为也应该添加到checkgroup中,不是吗?至少这是我在检票口中理解这种机制的方式。
-
你有堆栈跟踪吗?
-
我没有遇到任何异常,我将在主帖中添加我的问题示例。
-
请创建一个快速启动应用程序来演示该问题。例如。在 GitHub/BitBucket。