2012-10-14 9 views
6

Ho un modulo con un elenco annidato di mapping, ma ho problemi durante l'iterazione nel modello. La forma assomiglia a questoCome eseguire il rendering di un modulo con la mappatura degli elenchi

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

sto passando questo modulo nel modello e cerco di scorrere i attività. Di conseguenza solo gli errori del compilatore o un dump completo dei metadati del Form come risultato.

Fornisce un metadata + dump di dati del modulo completo, con l'attività inclusa. (Tag il LI è un navigatore scheda che conterrà i campi di input)

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

Iterazione sorta di opere (è il codice viene eseguito), ma è completamente inutilizzabile dal punto di vista dell'utente.

Ho anche provato vari per-loop, solo darmi compilatore errori, dicendo

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

Le mie domande sono:

  1. E 'doveva essere possibile costruire una tale forma, e Com'è fatto?
  2. Quali altre opzioni sono disponibili per il rendering dei moduli di input con relazioni uno-a-molti?
+0

ho postato questa domanda ieri: "http: // StackOverflow. it/q/12883589/185840 "e ha trovato una soluzione basata su una tupla in cui è possibile @repreparare i moduli annidati in modo formA.zip (formB) - potrebbe aiutare ... ma non è sicuro quale problema si sta affrontando qui è, sembra che la forma sia stata prodotta. Sai che devi fare qualcosa come @inputText (activity ("activityStatus"), "_label->" Activity Status ") per produrre un formfield, giusto? – virtualeyes

+0

La tua soluzione sembra andare lungo il percorso dove sto andando, e lo proverò :). Per quanto riguarda i campi di input nella mia domanda: poiché l'iterazione che dovrebbe generare le schede di navigazione (li elementi) non è riuscita, ho lasciato gli input per brevità. – dagb

+0

Ho scoperto che il rendering dei campi di input funziona perfettamente. Sta solo generando elementi li che sono problematici. Come può essere utilizzato il valore di un campo modulo per tali scopi? – dagb

risposta

1

La soluzione è semplice come questo, 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> 

Quindi ripetere per la raccolta mappato nel modello

<ul id="activities"> 
    @repeat(assignmentForm("activities"), min=0) { activity => 
     @navtab(activity) 
    } 
</ul> 
0

È possibile utilizzare indexes metodo per rendere la lista (seq, array) valori.

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

Ma questo è inutile, così ho creato metodo implicito

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

Dopo l'importazione di questa classe, è possibile utilizzare @assignmentForm("activities").values

Problemi correlati