【问题标题】:Wicket form changes removed on ajax update在 ajax 更新中删除了 Wicket 表单更改
【发布时间】:2018-06-25 10:36:10
【问题描述】:

我有一个很大很复杂的表单,其中包含很多表单组件。

在其中一个下拉字段中,我添加了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”。

【问题讨论】:

    标签: java ajax wicket wicket-7


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

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

    【讨论】:

    • 1.此解决方案是否也适用于 TextFields? 2. 我会继续尝试这个解决方案。
    • 谢谢你,它工作得很好!使用 visitChildren 检测要添加到目标的组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多