2013-05-30 165 views
4

的多个实例,我有一出戏模板看起来像这样:游戏框架 - 一个Form

@(projects: List[Project], projectForm: Form[Project]) 

@import helper._ 
@main("Create projects") { 
    <div class="accordion"> 
    @for(project <- projects) { 
     <h3>@project.name</h3> 
     <div> 
     @form(routes.Application.updateProject(project.getId), 'class -> "ajaxForm") { 
      @* I'm not even sure why I need to specify the FQN of Map here *@ 
      @defining(projectForm.bind(scala.collection.mutable.Map("name" -> project.name, 
       "description" -> project.description))) { form => 
       @inputText(form("name")) 
       @textarea(form("description")) 
       <input type="submit" value="Update"/> 
      } 
     } 
     </div> 

    } 
    </div> 
    @form(routes.Application.createProject()) { 
     <fieldset> 
      <legend>Create a new project</legend> 
      @inputText(projectForm("name")) 
      @textarea(projectForm("description")) 
      <input value="create" type="submit"/> 
     </fieldset> 
    } 
} 

Project是包含long idString namedescription的典范。

我在这里的问题是,这里

@inputText(form("name"), 'value -> project.name) 
@textarea(form("description")) 

的的inputText和textarea的始终获得IDS namedescription分别。我有许多这些,所以这些ID不再是唯一的。这仍然适用于Chrome,但我知道ID必须在文档中是唯一的。 Play中是否有内置的方式来处理这类问题,还是必须提出一个自己的解决方案?如果是后者,你是否对如何解决这个问题有一些建议?或者我在做一些根本性错误?

+0

关于你为什么你必须使用FQN在地图是因为它是可变的评论。默认情况下导入不可变变体。所以问题是为什么你会在这里使用可变的Map? – maba

+0

@maba随着非限定性的Map我得到编译错误(“对象java.util.Map不是一个值”)。显然它认为我的意思是'java.util.Map',考虑到我在一个Scala源代码中,甚至没有导入它,这很奇怪。显然这张不可变换的地图也能起作用,但我仍然必须对其进行限定。 – Cubic

回答

4

您可以使用该项目的列表索引和它添加到id

@for((project, index) <- projects.zipWithIndex) { 
    <h3>@project.name</h3> 
    <div> 
    @form(routes.Application.updateProject(project.getId), 'class -> "ajaxForm") { 
     @defining(projectForm.bind(scala.collection.mutable.Map(
      "name" -> project.name, 
      "description" -> project.description))) { form => 
      @inputText(form("name"), 'id -> ("name" + index)) 
      @textarea(form("description"), 'id -> ("description" + index)) 
      <input type="submit" value="Update"/> 
     } 
    } 
    </div> 
} 
+2

这工作。但你介意解释_how_?我的意思是,现在ID中有数字,form.bindFromRequest如何获得正确的值? – Cubic

+0

我没关系。尽管页面上有几种表单,但只有一个表单按下了提交按钮,它会将这些值发布到您的控制器。它是用来识别表单参数的'name'属性:[HTML和id之间的区别](http://stackoverflow.com/questions/1397592/difference-between-id-and-name-attributes-在-HTML) – maba