如何使用列表映射呈现表单

时间:2012-10-14 19:46:06

标签: scala playframework-2.0

我有一个带有嵌套映射列表的表单,但在模板中迭代它时遇到问题。表格看起来像这样

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

我的问题是:

  1. 是否可以构建这样的表格,以及如何完成?
  2. 我有哪些其他选项来渲染具有一对多关系的输入表单?

2 个答案:

答案 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