我正在使用play framework v 2.1开发一个应用程序 对于我必须使用Scala的观点 我试图阅读其中一个可以在这里找到的播放框架的示例代码 http://www.playframework.com/documentation/2.0.x/Samples表格一 在应用程序的views文件夹中,有一个名为form.scala.html
的文件views.contact包@(contactForm: Form[Contact])
@import helper._
@import helper.twitterBootstrap._
@title = {
Add a new contact <small><a href="@routes.Contacts.edit">Or edit an existing contact</a></small>
}
@phoneField(field: Field, className: String = "phone") = {
@input(field, '_label -> "Phone numbers", '_class -> className) { (id, name, value, _) =>
<input type="text" name="@name" value="@value">
<a class="removePhone btn danger">Remove</a>
}
}
@informationGroup(field: Field, className: String = "profile") = {
<div class="twipsies well @className">
<a class="removeProfile btn danger pull-right">Remove this profile</a>
@inputText(
field("label"),
'_label -> "Label"
)
@inputText(
field("email"),
'_label -> "Email"
)
<div class="phones">
@repeat(field("phones"), min = 0) { phone =>
@phoneField(phone("number"))
}
@**
* Keep an hidden block that will be used as template for Javascript copy code
**@
@phoneField(
field("phones[x].number"),
className = "phone_template"
)
<div class="clearfix">
<div class="input">
<a class="addPhone btn success">Add a phone number</a>
</div>
</div>
</div>
</div>
}
@main(title, nav = "contact") {
@if(contactForm.hasErrors) {
<div class="alert-message error">
<p><strong>Oops</strong> Please fix all errors</p>
</div>
}
@helper.form(action = routes.Contacts.submit, 'id -> "form") {
<fieldset>
<legend>General informations</legend>
@inputText(
contactForm("firstname"),
'_label -> "First name"
)
@inputText(
contactForm("lastname"),
'_label -> "Last name"
)
@inputText(
contactForm("company"),
'_label -> "Company"
)
</fieldset>
<fieldset>
<legend>Profiles</legend>
<div id="profiles">
@repeat(contactForm("informations")) { information =>
@informationGroup(information)
}
@**
* Keep an hidden block that will be used as template for Javascript copy code
**@
@informationGroup(
contactForm("informations[x]"),
className = "profile_template"
)
<div class="manage">
<a class="addProfile btn success">Add another profile</a>
</div>
</div>
</fieldset>
<div class="actions">
<input type="submit" class="btn primary" value="Insert">
<a href="@routes.Application.index" class="btn">Cancel</a>
</div>
}
代码应该呈现这样的视图
通过按添加电话号码,某些字段会添加到表单中,它将变为如下所示:
让我对这段代码感到困惑的是这些部分及其工作原理:
@phoneField(field: Field, className: String = "phone") = {
@input(field, '_label -> "Phone numbers", '_class -> className) { (id, name, value, _) =>
<input type="text" name="@name" value="@value">
<a class="removePhone btn danger">Remove</a>
}
}
和
@repeat(field("phones"), min = 0) { phone =>
@phoneField(phone("number"))
}
@**
* Keep an hidden block that will be used as template for Javascript copy code
**@
@phoneField(
field("phones[x].number"),
className = "phone_template"
)
有人可以向我提供有关这些代码行如何工作的简要说明,请不要将链接到博客或网站上的简短教程给Scala我可以通过Google搜索自己找到它们
我正在寻找关于这些代码行的简短但描述性的解释, 提前致谢!!
btw我从原始代码中删除了javascript代码
答案 0 :(得分:2)
让我们从@phoneField
函数开始:
@phoneField(field: Field, className: String = "phone") = {
@input(field, '_label -> "Phone numbers", '_class -> className) { (id, name, value, _) =>
<input type="text" name="@name" value="@value">
<a class="removePhone btn danger">Remove</a>
}
}
@input
是一个帮助程序(即函数),允许您自己为字段创建html。在此上下文中需要这样做,因为我们要添加.removePhone
按钮。所以@phoneField
只需要Field
的实例并构造html输入和删除链接。
现在,@repeat
怎么办?
@repeat(field("phones"), min = 0) { phone =>
@phoneField(phone)
}
在app / controllers / Contacts.scala中定义了contactForm,在那里你可以看到“phones”字段定义为list(text)。它是一种带有文本字段元素的集合。
因此@repeat将迭代field("phones")
并将每个文本字段传递给@phoneField
。重要的是,所有转到@phoneField的字段都会有“phone [0]”,“phones 1”等名称,....
现在事情变得有趣了。
@phoneField(
field("phones[x]"),
className = "phone_template"
)
构建javascript函数的模板,该模板将响应“添加电话字段”按钮将其内容复制到页面。看起来像field("phones[x]")
构造名为“phones [x]”的空字段,类似于@repeat
生成的字段。然后整个构造将创建一个名为“phones [x]”和空值的电话字段(和删除链接)。
当您查看javascript代码时,您会看到当用户点击“添加电话号码”链接时,将执行javascript回调,将html从模板复制到<div class="phones">
下的dom,并且将重新编号所有.phone输入,其名称与/phones\[.+\]/
我希望您已阅读Using the form template helpers。