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. 对于呈现具有一对多关系的输入表单,我还有哪些其他选择?
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

You can use indexes method to render list(seq, array) values.

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

But this is unuseful, so I created implicit method

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))
    }
  }
}

After import this class, you can use @assignmentForm("activities").values

于 2017-01-11T03:32:48.983 回答