Wicket表单更改在Ajax更新中被删除

时间:2018-06-25 10:36:10

标签: java ajax wicket wicket-7

我有一个相当大而复杂的表单,其中包含许多表单组件。

在一个下拉字段中,我添加了public class AnyController { //if you want to access connectionId in here , add hubcontext in here too private readonly ChatHub _chatHub; public AnyController(ChatHub chatHub) { _chatHub = chatHub; } public IActionResult Index() { _chatHub.AddToGroup("groupname"); } } 来处理下拉列表中的更改。基于这些更改,我将以这种方式更新表单中的其他字段:

AjaxFormComponentUpdatingBehavior

Foo字段已使用下拉列表中的值正确更新。

问题在于,表单中其他文本字段中的所有更改均被删除。我知道会发生这种情况,因为尚未在模型中对其进行更新。

我该如何解决? 是否可以通过某种方式(不提交表格)将表格中到目前为止所有填写的数据写入模型?

我需要在ajax方法中将整个表单添加到目标中,因为要更新的字段是表单模型对象的子代,并动态地添加到了表单中。例如,我不能做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); } } }); ,因为可能有任意数量的“ fooFields”。

1 个答案:

答案 0 :(得分:3)

  1. 您可以在所有其他表单(选择)组件上使用AjaxFormComponentUpdatingBehavior / AjaxFormChoiceComponentUpdatingBehavior,以便它们在修改后更新表单的模型对象。

  2. 您可以使用Component#visitChildren()并动态决定要添加到AjaxRequestTarget中的特定表单组件(如果很容易确定)。甚至AjaxRequestTarget也有方法#addChildren(),但是过滤子组件并不那么灵活。