在模板内部的Play Framework中,我可以定义类似的函数:
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
<h1>@title("hello world")</h1>
我可以在单独的文件中定义这样的功能,并使其可以在多个模板之间重复使用吗?
答案 0 :(得分:3)
至少有几种解决方案:
首先正在使用tags 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)
语法,您可以看到它已完成in the repo。当然,您需要创建这样的自定义类,并将其导入视图的开头。另外请记住,它不需要只有一个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>
}
答案 1 :(得分:1)
您可以使用以下内容创建名为title.scala.html
的新文件:
@(text: String)
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
@title(text)
然后您可以根据需要在模板中使用它。