如何更新thymeleaf表单中的“th:field”?

kyks70gy  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(836)

我正在用thymeleaf制作一个springmvc应用程序。
应用程序在窗体中包含一个组合框/下拉菜单。我希望组合框中的每个选定值都链接到特定字段的更新。即 value 1 ->表单更新
field 1 value 2 ->表单更新 field 2 ...
我试图改变 th:field 使用javascript,但是看起来thymeleaf标记是“预处理”的,一旦html被呈现并且表单与特定字段相关联,它就保持这样。
面对这个问题最好的办法是什么?
每次组合框的值更改时是否需要触发页面刷新,以便表单更新的字段可以更改,还是有更好的方法?
提前谢谢。

dkqlctbz

dkqlctbz1#

正如您提到的,在呈现页面之后,不可能更改“th:field”或任何特定于thymeleaf的属性。
但是,“th:field”通常只是设置“id”、“name”和“value”属性的快捷方式(请看这里:https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#inputs)因此您可以从javascript手动更新这些内容。
尽管在本例中,我认为最简单的解决方案是在java代码中创建一种新类型的对象,其中的字段与表单的字段匹配,然后使用该对象。例如:

class MyFormDTO {

    private String fieldToUpdate;
    private String newValue;

    // ... getters and setters ...

}

在模板中:

<select th:field="*{fieldToUpdate}">
    <option value="field1">Field1</option>
    <option value="field2">Field2</option>
</select>

<input type="text" th:field="*{newValue}" />

以及您的post handler方法:

@PostMapping("/my-form")
public String submitMyForm(MyFormDTO myFormDTO) {
    MyBackendObject myBackendObject = MyBackendService.get(...);

    switch (myFormDTO.getFieldToUpdate()) {
        case "field1": myBackendObject.setField1(myFormDTO.getNewValue()); break;
        case "field2": myBackendObject.setField2(myFormDTO.getNewValue()); break;
    }
}

…而不是直接使用“mybackendobject”(或其他什么)作为form对象。

相关问题