Play Framework 模板中模板之间的可重用函数

Reusable functions between templates in Play Framework templates

在模板内的 Play Framework 中,我可以定义这样的函数:

@title(text: String) = @{
  text.split(' ').map(_.capitalize).mkString(" ")
}

<h1>@title("hello world")</h1>

我可以在单独的文件中定义这样的函数并使其可在多个模板之间重复使用吗?

您可以使用以下内容创建一个名为 title.scala.html 的新文件:

@(text: String)

@title(text: String) = @{
    text.split(' ').map(_.capitalize).mkString(" ")
}

@title(text)

然后您可以根据需要在模板中使用它。

至少有几种解决方案:

First 使用 tags 正如 Makis 向您展示的,在大多数情况下没问题,即使它添加了额外的空行并不重要(至少当我们谈论生成 HTML 片段时,即代表列表中的重复新闻项目)- 你可以即 optimize/compress 你的 HTML 在 post-process如果您关心传输速率。

其次正在创建一个包含静态函数的Scala对象(在Java中也是可能的)和returns play.twirl.api.Html("<div>your code</div>"),这个您可以通过编程方式完全按照您的需要调整代码,避免空行,删除或替换空格等。在您的模板中,您需要使用如下语法:@full.qualified.path.to.Object.method("foo", "bar") 返回 Html("...") 导致您不需要在您的视图中转义返回的代码。

第三种方法是使用自己的TemplateMagic-like方法,它允许您扩展 任何类型的对象并对其执行一些逻辑,好的示例是 "active".when(someCondition) 语法,你可以看到它已经完成 in the repo。当然,您只需要像这样创建自定义 class 并将其导入到视图的开头。另请记住,它不需要只有一个 Boolean 参数,您的方法可以根据需要使用任意数量的参数——您需要的任何类型。它可以只是无参数的。

编辑 - 示例:

app/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>    
}