【问题标题】:Howto render a form with list mapping如何使用列表映射呈现表单
【发布时间】:2017-01-12 14:47:14
【问题描述】:

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

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

【问题讨论】:

  • 我昨天发布了这个问题:“stackoverflow.com/q/12883589/185840”并提出了一个基于元组的解决方案,您可以在其中以 formA.zip(formB) 方式@repeat 通过嵌套表单 - 可能会有所帮助.. .但不确定您在这里遇到什么问题,听起来好像正在制作表格。您确实知道您需要执行类似 @inputText(activity("activityStatus"), '_label-> "Activity Status") 的操作来生成表单域,对吧?
  • 您的解决方案似乎沿着我前进的道路前进,我会尝试一下:)。关于我的问题中的输入字段:由于应该生成导航选项卡(li 元素)的迭代失败,为了简洁起见,我没有输入。
  • 我发现渲染输入字段效果很好。它只生成有问题的 li 元素。如何将表单字段的值用于此类目的?
  • 在“views.utils”目录中创建一个名为“li.scala.html”的自定义助手,并在您计划使用它的模板中创建“@import views.html.li”。对于文件的内容,请遵循 Play 来源“github.com/playframework/Play20/blob/master/framework/src/play/…”中的字段帮助器示例
  • 然后@li("foo.bar") 访问嵌套表单内容并生成列表元素

标签: scala playframework-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>

【讨论】:

    【解决方案2】:

    您可以使用indexes 方法来呈现列表(序列,数组)值。

    @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

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多