#scala #tags #playframework #playframework-2.0
#scala #Теги #playframework #playframework-2.0
Вопрос:
Существует не так много документации о движке шаблонов Play 2.0.
Как создать тег с помощью шаблона Scala?
Ответ №1:
Механизм шаблонов в play 2.0 напрямую поступает из модуля play 1.0 scala. Если вам все еще интересно, какие преимущества приносит функциональный язык, такой как Scala, в картину, что ж, это, безусловно, одна из областей, где он сияет.
Демонстрация:
В синтаксисе scala тег — это не что иное, как вызов функции. что интересно, так это то, что фрагменты html рассматриваются как сами функции, что позволяет использовать самые мощные конструкции подстановки.
Давайте определим html-страницу с именем mytag.scala.html
file:apps/views/mytags/mytag.scala.html
@(level:String = "error", index: Int)(body: (String) => Html)
@level match {
case "success" => {
<p class="success" index="@index">
@body("green")
</p>
}
case "warning" => {
<p class="warning" index="@index">
@body("orange")
</p>
}
case "error" => {
<p class="error" index="@index">
@body("red")
</p>
}
}
Приведенный выше тег принимает 3 параметра в 2 разных группах параметров:
- Уровень, представленный строкой (которая по умолчанию имеет значение «ошибка»)
- Индекс
- Наконец, функция с именем body, которая принимает строковый параметр и возвращает HTML-код. Обратите внимание, что тело определяется в своей собственной группе параметров. это эквивалентно тому, что мы знаем в j2ee как фрагмент jsp.
Теперь давайте посмотрим, как мы можем использовать этот тег:
@import views.mytags._
@mytag("error",2) { color =>
Oops, something is <span style="color:@color">wrong</span>
}
Прежде чем мы сможем использовать тег (или функцию), нам нужно сообщить Play, где он находится: это цель инструкции import . Обратите внимание, что местоположение (путь) файла тега не имеет значения, пока вы настраиваете местоположение импорта, как и в пакетах Java.
Следует за самим вызовом, который довольно прост. Однако обратите внимание, что мы передаем параметризованный фрагмент html в тег.
Для получения дополнительной информации вы можете найти документацию по шаблону scala по этому URL
Play 2.0 в конечном итоге будет поставляться со своей собственной документацией.
Ответ №2:
Совершенно ненужный ответ, но просто для обучения моего scala. Разве это не сработало бы и было бы короче, оставаясь понятным?
@(level:String = "error", index: Int)(body: (String) => Html)
<p class="@level" index="@index">
@body(
@level match {
case "success" => "green"
case "warning" => "orange"
case "error" => "red"
}
)
</p>
Комментарии:
1. Я, честно говоря, не знаю, пока не эксперт по scala. похоже, хороший вопрос по SO.
2. Я должен повторить play2.0 в ближайшее время. В прошлый раз это было действительно слишком сыро для моих экспериментов! Я еще не эксперт по Scala, но я многому научился, и до сих пор это единственный язык, который создает у меня впечатление, что я определенно мог бы отключить Java в конце 😉
3. В этом случае, если level — это что-то иное, чем успех, предупреждение или ошибка, у вас будет тег p с этим классом css, который может не иметь отступа. В ответе от @Olivier Refalo тег P будет напечатан только в том случае, если он соответствует одному из уровней ошибок.
4. на самом деле, если это не одно из этих 3 значений, это ошибка совпадения — как написано, этот тег настаивает на действительном переданном «уровне» — ваш подход лучше.
Ответ №3:
я получаю ошибку компилятора, когда я использовал первый пример. Удалите «представления». при импорте проблема решена
используйте @import mytags._
Полный пример (http://www.playframework.com/documentation/2.1.1/JavaTemplateUseCases ):
Let’s write a simple views/tags/notice.scala.html tag that displays an HTML notice: @(level: String = "error")(body: (String) => Html) @level match { case "success" => { <p class="success"> @body("green") </p> } case "warning" => { <p class="warning"> @body("orange") </p> } case "error" => { <p class="error"> @body("red") </p> } }
А теперь давайте используем его из другого шаблона:
@импортировать теги._
@notice(«ошибка») { color => Ой, что-то не так }