Многоразовые функции между шаблонами в шаблонах Play Framework
В Play Framework внутри шаблона я могу определить такие функции:
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
<h1>@title("hello world")</h1>
Могу ли я определить такую функцию в отдельном файле и сделать ее многоразовой между несколькими шаблонами?
2 ответа
Есть как минимум несколько решений:
Во-первых, это использование тегов, как показал вам Makis, и в большинстве случаев это нормально, даже если он добавляет дополнительные пустые строки, это не имеет значения (по крайней мере, когда мы говорим о создании фрагментов HTML, то есть представлении повторяющихся элементов новостей в списке) - вы можете, т.е. оптимизировать / сжать ваш HTML в пост-процессе, если вы заботитесь о скорости передачи.
Во-вторых, это создание объекта Scala, который содержит статические функции (в Java это также возможно) и возвращает play.twirl.api.Html("<div>your code</div>")
Таким образом, вы можете программно подгонять свой код именно так, как вам нужно, избегать пустых строк, удалять или заменять пробелы и т. д. Просто в вашем шаблоне вам нужно будет использовать синтаксис, например: @full.qualified.path.to.Object.method("foo", "bar")
возвращая Html("...")
причины, по которым вам не нужно экранировать возвращенный код в вашем представлении.
Третий подход - использование собственных методов, похожих на TemplateMagic, которые позволяют расширять объекты любого типа и выполнять с ними некоторую логику. "active".when(someCondition)
Синтаксис, вы можете увидеть, как это сделано в репо. Конечно, вам нужно просто создать собственный класс и импортировать его в начале ваших представлений. Также имейте в виду, что это не должен быть только один Boolean
аргумент, ваши методы могут использовать столько параметров, сколько вам нужно - любой тип, который вам нужен. Это может быть просто без параметров.
редактировать - образец:
Приложение /MyAPI /MyMagic.scala
package myapi
import play.twirl.api.Html
import scala.language.implicitConversions
object MyMagic {
class RichString(string: String) {
def upperWords() = {
Html(string.split(' ').map(_.capitalize).mkString(" "))
}
def bold() = {
Html("<b>" + string + "</b>")
}
def when(predicate: => Boolean) = {
predicate match {
case true => string
case false => ""
}
}
}
implicit def richString(string: String): RichString = new RichString(string)
}
использование в представлении (ях)
@(title: String)
@import myapi.MyMagic._
@main("Welcome to Play") {
@title.upperWords() <br>
@{"foo bar baz".upperWords()} <br>
@{"I'm bolded LOL".bold()} <br>
<ul>
@for(item <- 1 to 10){
<li >Item no.: @{item} @{"(first item)".when(item==1)}</li>
}
</ul>
}
Вы можете создать новый файл с именем title.scala.html
с этим содержанием:
@(text: String)
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
@title(text)
Затем вы можете использовать его в своих шаблонах, как вы хотели бы.