2016-05-30 14 views
0

私のHTMLでは、プレイヤーのリスト(spieler)を反復処理します。ループ内のラジオボタンの値をフィールドにバインドするには

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

各プレイヤーは、同じグループ内に未チェックのラジオボタンが必要です。 1つのラジオボタンがチェックされたら、その値を特定のプレーヤーの属性にバインドします。属性はブールフィールド(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}"/> 

?ループ内の私のモデル

編集の:簡単な言葉で

、私は3を持っています。各spielerには、ブール値属性spieler.zerrissenがあります。各spielerにはラジオボタンが表示されています。 spieler 1というラジオボタンを押してフォームを送信した場合、@ModelAttribute spieler - spieler.zerrissenのspieler 1`が真でなければなりません。どうすればこれを達成できますか?

私はth:field属性を使用しているため、私のモデルへのバインディングが機能しています。しかしth:fieldを使用すると、生成される各ラジオボタンの名前が異なるため、ラジオボタンだけでなく、それぞれのラジオボタンも確認できます。

答えて

2

ラジオボタンをthymeleafにこの方法を使用するように設計されていません。ラジオボタンのグループはすべて同じフィールドを持つ必要があります(ラジオボタンを選択すると、そのフィールドが選択された値に設定されます)。異なるフィールドにマップされるラジオボタンのグループを持つことはできません。あなたの目の上の新しいフィールドにマップ

  1. 使用ラジオボタン:オブジェクト

    私はあなたがここに2つのオプションがあると思います。 getterとsetterを追加し、getterがspielerをループし、最初のspielerのインデックスを返します。ここで、zerrissen == trueの場合、setterはspielerのインデックスを取得し、そのオブジェクトに対してzerrissen = trueを設定します他のすべてについて)。ラジオボタンの値は、各スピラーのインデックスになります。

  2. 何らかの種類のjavascriptソリューション(チェックボックスとjavascript/serverのサイド検証を使用して、それらを選択するだけです)。

0

th:valueタグとth: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

おかげ

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

ヘルパーメソッドcontMetは()私のためのソリューションでした。しかし、モデルへのバインディングは機能しません。それに対する解決策はありますか? – Patrick

+0

私は答えを更新しました。それを試してみてください! – sanluck

+0

申し訳ありませんが、バインディングが機能しないようです。私はこのフィールドを空にする必要があります: '* {runden [__ $ {rundeStat.index} __]。spieler [__ $ {spielerStat.index} __]。zerrissen'これは入力にどこで設定すればよいですか?チェックボックスの場合、これは機能します。 (更新された質問) – Patrick

0

私は実用的なソリューションを完成させました。初心者にとっては少し難解でした。

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 
関連する問題