2012-10-14 34 views
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) 
) 

我傳遞這種形式爲模板,並嘗試遍歷活動。到目前爲止,只有編譯器錯誤或Form的完整元數據轉儲纔是結果。

這給出了包含活動的完整表單的元數據+數據轉儲。 (該LI標籤是標籤導航將包含輸入字段)

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

迭代排序作品(是代碼運行),但它是從用戶的角度來看完全無法使用。

我也嘗試過各種for循環,只給我的編譯器錯誤,說

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

我的問題是:

  1. 是它應該是可以構建這樣的形式,和它是如何完成的?
  2. 我有什麼其他選擇來渲染具有一對多關係的輸入表單?
+0

我昨天張貼了這個問題:「HTTP://計算器。 com/q/12883589/185840「,並提出了一個基於元組的解決方案,你可以通過formA.zip(formB)時尚的嵌套形式重複 - 可能有幫助...但不知道你在這裏遇到什麼問題聽起來像表單正在製作中。你知道你需要做一些像@inputText(activity(「activityStatus」),'_label->「Activity Status」)來產生一個formfield,對嗎? – virtualeyes

+0

你的解決方案似乎走上了我前進的道路,我會試試:)。關於我的問題中的輸入字段:由於應該生成導航選項卡(li元素)的迭代失敗,爲了簡潔起見,我留下了輸入。 – dagb

+0

我發現渲染輸入字段完美。它只生成有問題的li元素。如何將表單字段的值用於此目的? – dagb

回答

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> 
0

您可以使用indexes方法來呈現列表重複的映射集合(seq,array)值。

@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