Как работают функции Scala в Play framework 2.1
Я разрабатываю приложение с Play Framework v 2.1 для представлений, которые я должен использовать Scala
Я пытался прочитать один из примеров кода игровой среды, который можно найти здесь http://www.playframework.com/documentation/2.0.x/Samples the Forms one
В папке views приложения находится файл views.contact package с именем form.scala.html
@(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
Я просто ищу краткое, но описательное объяснение этих строк кода, спасибо заранее!!
Кстати, я исключил коды JavaScript из оригинального кода
1 ответ
Давайте начнем с @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)
}
В приложении /controllers/Contacts.scala определен contactForm и там вы можете увидеть, что поле "Телефоны" определено как список (текст). Это своего рода коллекция с элементами, которые являются текстовыми полями. Так что @repeat будет перебирать field("phones")
и передать каждое текстовое поле @phoneField
, Важно то, что все поля, которые будут идти в @phoneField, будут иметь имена, такие как "phones [0]", "phones 1",....
Теперь все стало интересно.
@phoneField(
field("phones[x]"),
className = "phone_template"
)
создает шаблон для функции javascript, который будет копировать его содержимое на страницу в ответ на кнопку "добавить поле телефона". Похоже field("phones[x]")
создает пустое поле с именем "phones[x]", похожее на то, что @repeat
генерирует. Затем вся конструкция создаст поле телефона (и ссылку для удаления) с именем "phones[x]" и пустым значением.
Когда вы посмотрите на код javascript, вы увидите, что когда пользователь нажимает ссылку "Добавить номер телефона", будет выполнен обратный вызов javascript, который скопирует HTML-код из шаблона в dom под <div class="phones">
, и перенумерует все входные данные.phone, имя которых соответствует /phones\[.+\]/
Я надеюсь, что вы прочитали Использование помощников шаблона формы.