我很难用我想要的行为创建一个动态表单。我认为我有一个解决方案,但我认为必须有一个更好的解决方案。
我用的是Thymeleaf-Spring。
目标
我正在创建一个动态表单,它将包括一个包含邮政地址的表。在可用的地址中,一个要标记为主地址。有关示例,请参见 这把小提琴 。
问题
短版本--每行都有一个单选按钮,我需要在行级别作为复选框(已经接受了,这必须通过JS完成),并在表级别上充当单选按钮。
表体是使用以下代码设置的。
<tr th:each="addr : ${addresses}" th:include="address :: row" th:with="prefix=__${prefix}__.address[__${addrStat.index}__]."/>
前缀变量赋值是存在的,因为此表在窗体上嵌套了几个级别。它所做的就是将额外的数据附加到已经存在的前缀中。
正在提取的地址片段如下所示(为了简洁起见,这里压缩格式):
<tr th:fragment="row"> <input type="text" th:field="*{__${prefix}__line1}"/> <input type="text" th:field="*{__${prefix}__line2}"/> <td><input type="text" th:field="*{__${prefix}__city}"/></td> <td><select th:field="*{__${prefix}__state}"/></td> <td><input type="text" th:field="*{__${prefix}__zip}"/></td> <td><select th:field="*{__${prefix}__type}"/></td> <td><input type="checkbox" th:field="*{__${prefix}__valid}"/></td> <input type="radio" th:field="*{__${prefix}__primary}" th:value="*{__${prefix}__primary}" th:checked="*{__${prefix}__primary}"/> </tr>
在选中单选按钮时,将设置一点jQuery,以确保元素的值为 true ,否则将确保 false 。
true
false
问题是当Thymeleaf生成这些行时,根据 th:field 中的值为每个单选按钮分配一个唯一的名称和id。当然,这会产生每个单选按钮在它自己的组中的不需要的行为。它们都可以同时进行选择,而不是在任何给定的时间只选择表中的一个。
th:field
我尝试的第一个解决方案是修改父行以包含一个新的 group 变量:
group
<tr th:each="addr: ${addresses}" th:include="address :: row" th:with="group='__${prefix}__primaryAddress', prefix='__${prefix}__address[__${addrStat.index}__].'"/>
然后将单选按钮上的 th:field 属性替换为单独的 th:id 和 th:name 属性:
th:id
th:name
<input type="radio" th:id="'__${prefix}__primary'" th:name="${group}" th:value="*{__${prefix}__primary}" th:checked="*{__${prefix}__primary}"/>
这在表单上给出了想要的行为,但代价是在回发时丢失了值。Thymeleaf-Spring不能再将form元素连接到object属性。这当然是不可接受的。
电流溶液
我目前的解决方案(我并不特别喜欢)是坚持使用连接到object属性的 th:field 属性,并包含一个 data-group 属性,这将允许我通过jQuery强制分组。
data-group
<input type="radio" th:field="*{__${prefix}__primary}" th:value="*{__${prefix}__primary}"