ajax 更新时删除了 Wicket 表单更改
Wicket form changes removed on ajax update
我有一个很大很复杂的表单,其中包含很多表单组件。
在其中一个下拉字段中,我添加了一个 AjaxFormComponentUpdatingBehavior
来处理下拉列表中的更改。基于这些更改,我正在更新表单中的一些其他字段,这样:
masterFooDropDown.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
String value = (String) getFormComponent().getModelObject();
if (value != null) {
for (Foo foo: form.getModelObject().getFoos()) {
foo.setValue(value);
}
target.add(form);
}
}
});
Foo 字段使用下拉列表中的值正确更新。
问题是表单中其他文本字段中的任何更改都被删除了。我知道会发生这种情况,因为它们尚未在模型中更新。
我该如何解决这个问题?
是否可以通过某种方式(不提交表单)将目前表单中所有填写的数据写入模型?
我需要将整个表单添加到 ajax 方法中的目标,因为应更新的字段是表单模型对象的子项并动态添加到表单中。例如,我不能做 target.add(fooFieldX)
,因为可能有任意数量的 "fooFields"。
您可以在所有其他表单(选择)组件上使用 AjaxFormComponentUpdatingBehavior/AjaxFormChoiceComponentUpdatingBehavior,以便它们在修改时更新表单的模型对象。
您可以使用 Component#visitChildren() 并动态决定将哪些特定表单组件添加到 AjaxRequestTarget,如果很容易决定的话。即使 AjaxRequestTarget 也有方法 #addChildren()
但过滤子组件并不灵活。
我有一个很大很复杂的表单,其中包含很多表单组件。
在其中一个下拉字段中,我添加了一个 AjaxFormComponentUpdatingBehavior
来处理下拉列表中的更改。基于这些更改,我正在更新表单中的一些其他字段,这样:
masterFooDropDown.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
String value = (String) getFormComponent().getModelObject();
if (value != null) {
for (Foo foo: form.getModelObject().getFoos()) {
foo.setValue(value);
}
target.add(form);
}
}
});
Foo 字段使用下拉列表中的值正确更新。
问题是表单中其他文本字段中的任何更改都被删除了。我知道会发生这种情况,因为它们尚未在模型中更新。
我该如何解决这个问题? 是否可以通过某种方式(不提交表单)将目前表单中所有填写的数据写入模型?
我需要将整个表单添加到 ajax 方法中的目标,因为应更新的字段是表单模型对象的子项并动态添加到表单中。例如,我不能做 target.add(fooFieldX)
,因为可能有任意数量的 "fooFields"。
您可以在所有其他表单(选择)组件上使用 AjaxFormComponentUpdatingBehavior/AjaxFormChoiceComponentUpdatingBehavior,以便它们在修改时更新表单的模型对象。
您可以使用 Component#visitChildren() 并动态决定将哪些特定表单组件添加到 AjaxRequestTarget,如果很容易决定的话。即使 AjaxRequestTarget 也有方法
#addChildren()
但过滤子组件并不灵活。