2016-05-30 94 views
0

在我的HTML中,我迭代了一个玩家列表(spieler)。如何将th:字段绑定到循环中单选按钮的值

<th:block th:each="spieler : ${runde.spieler}" > 

每个玩家在同一组中应该有一个未经检查的单选按钮。当选中一个单选按钮时,我想将该值绑定到特定播放器的属性。该属性是一个布尔字段(zerrissen)

<input type="radio" th:value="${spieler.zerrissen}" th:field="*{runden[__${rundeStat.index}__].spieler[__${spielerStat.index}__].zerrissen}" /> 

对于复选框结合工作正常,但随着单选按钮它不工作。

<input type="checkbox" th:field="*{runden[__${rundeStat.index}__].spieler[__${spielerStat.index}__].gegangen}"/> 

我怎么能一个单选按钮绑定到一个布尔属性?在循环中我的模型

编辑的:

简单地说,我有三个spieler。每个spieler都有一个布尔属性:spieler.zerrissen。每个spieler在视图上都有一个单选按钮。如果我点击spieler 1的单选按钮并提交表格,则spieler 1`的@ModelAttribute spieler-spieler.zerrissen应该是true。我怎样才能做到这一点?

绑定到我的模型正在工作,因为我使用th:field属性。但使用th:field也意味着每个单选按钮的生成名称是不同的,所以我可以检查每个单选按钮,而不仅仅是一个。

回答

2

单选按钮没有被设计成使用这种方式thymeleaf 。一组单选按钮应该都有相同的th:字段(并且选择一个单选按钮将该字段设置为所选值)。您不能有一组单选按钮映射到不同的字段。

我想你这里有两种选择:映射到一个新的领域你的日

  1. 使用单选按钮:对象。你可以添加一个getter和setter,getter将循环遍历spielers,并返回第一个spieler的索引,其中zerrissen == true,setter将获取spieler的索引并在该对象上设置zerrissen = true(并且false在所有其他)。单选按钮的值将是每个spieler的索引。

  2. 某种JavaScript解决方案(使用复选框和JavaScript /服务器端验证,以确保他们只选择一个)。

0

发生这种情况是因为您同时使用了th:valueth:field标签。 根据文档 <input th:field="${someThing}" />会产生
<input id="someThing" name="someThing" />

,但你需要对所有的单选按钮的同name,这就是为什么它不工作。

所以,试试这个:

UPD尝试设置值为0或1不为真或假:

<th:block th:each="spieler, iterStat : ${runde.spieler}" > 
    <input type="radio" th:id="'spieler'+${iterStat.count}" 
      th:value="${spieler.zerrissen ? '1' : '0'}" name="spieler.zerrissen" th:checked=${spieler.zerissen} /> 
+0

谢谢您的回答。但绑定到模型不起作用。任何解决方案? – Patrick

+0

我已更新答案。尝试一下! – sanluck

+0

对不起,似乎绑定不起作用。我需要将这个字段放入:'* {runden [__ $ {rundeStat.index} __]。spieler [__ $ {spielerStat.index} __]。zerrissen'我应该在输入中设置它?对于复选框这可以工作。 (更新的问题) – Patrick

0

我刚刚找到一个工作解决方案。初学者有点棘手。

@Controller 
@GetMapping("/radio") 
public String radioButton(@ModelAttribute("foo") Foo foo, ModelMap model) { 
    model.addAttribute("cts", contMet());     
    return "radio"; 
} 

helper方法contMet()是一个解决方案,我说:

public List<String> contMet() { 

     List <String>cm = new ArrayList<>(); 
     Iterator <Foo> iter = cTR.findAll().iterator(); //cTR is a repository for the Foo class. 
     while(iter.hasNext()) { 
      cm.add(iter.next().getType()); 
     } 
     return cm; 
    } 

模板:

<div th:each="mo: ${cts}" th:object="${foo}"> 
    <input type="radio" th:field="*{type}" th:value="${mo}" th:text="${mo}" /> 
</div> 

Foo对象:

Public class Foo{ 
     @Id 
     private String conId = UUID.randomUUID().toString(); 
     private String type; 
    ---etc 
    --getters and setters 
相关问题