我有一个带有嵌套映射列表的表单,但在模板中迭代它时遇到问题。表格看起来像这样
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)
)
我将此表单传递给模板并尝试迭代活动。到目前为止,只有编译器错误或Form的完整元数据转储。
这提供了包含活动的完整表单的元数据+数据转储。 ( LI 标记是包含输入字段的标签导航器)
@repeat(assignmentForm("activities")) { activity =>
<li>@activity("activityId")</li>
}
迭代排序有效(代码运行),但从用户的角度来看,它完全无法使用。
我也尝试了各种for循环,只给了编译器错误,说
value map is not a member of play.api.data.Field
我的问题是:
答案 0 :(得分: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>
答案 1 :(得分: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