6

マッピングのネストされたリストを持つフォームがありますが、テンプレートでこれを繰り返すのに問題があります。フォームは次のようになります

val assignmentForm : Form[AssignmentData] = Form(
   "acceptedSign" -> nonEmptyText(),
    mapping("activities" -> list (    
      mapping("activityId" -> optional(text), 
          "activityStatus" -> optional(text)) 
          (ActivityData.apply)(ActivityData.unapply))
    )(AssignmentData.apply)(AssignmentData.unapply)
)

このフォームをテンプレートに渡し、アクティビティを反復しようとしています。これまでのところ、結果としてコンパイル エラーまたはフォームの完全なメタデータ ダンプのみが表示されます。

これにより、アクティビティを含む完全なフォームのメタデータとデータのダンプが得られます。( LIタグは、入力フィールドを含むタブ ナビゲーターです)

@repeat(assignmentForm("activities")) { activity =>
                    <li>@activity("activityId")</li>
                    }

反復機能しますが(コードが実行されます)、ユーザーの観点からはまったく使用できません。

また、さまざまな for ループを試しましたが、コンパイル エラーが発生するだけでした。

value map is not a member of play.api.data.Field

私の質問は次のとおりです。

  1. そのようなフォームを構築することは可能であると考えられていますか?それはどのように行われますか?
  2. 1 対多の関係を持つ入力フォームをレンダリングするために他にどのようなオプションがありますか?
4

2 に答える 2

1

ソリューションは navtab.scala.html と同じくらい簡単です。

@**
* Generate an LI element
*@

@(field: play.api.data.Field)
<li><a href='#@field.id' data-toggle="modal">@field("activityStatus").value</a></li>

次に、テンプレートのマップされたコレクションに対して繰り返します

<ul  id="activities">
    @repeat(assignmentForm("activities"), min=0) { activity =>
        @navtab(activity)
    }
</ul>
于 2012-10-20T05:01:27.930 に答える
0

メソッドを使用indexesして、リスト (seq、配列) 値をレンダリングできます。

@assignmentForm("activities").indexes.map(i =>
  assignmentForm("activities").indexes(s"[$i]").value
)

しかし、これは役に立たないので、暗黙的なメソッドを作成しました

import play.api.data.Field

object FieldExtend {
  implicit class FieldExtend(field: Field) {
    def values: Seq[Option[String]] = {
      field.indexes.map(i => field(s"[$i]").value)
    }
    def containsValue(value: Byte): Boolean = {
      values.contains(Some(value.toString))
    }
  }
}

このクラスをインポートした後、使用できます@assignmentForm("activities").values

于 2017-01-11T03:32:48.983 に答える