2

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

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

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

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

4

2 回答 2

3

至少有几种解决方案:

首先是使用Makis向您展示的标签,在大多数情况下没关系,即使它添加了额外的空行也没关系(至少当我们谈论生成 HTML 片段时,即表示列表上重复的新闻项目时) - 你可以 ie如果您关心传输率,请在后期处理中优化/压缩您的 HTML。

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

第三种方法是使用自己的类似 TemplateMagic 的方法,它允许您扩展任何类型的对象并对其执行一些逻辑,很好的示例是语法,您可以在 repo"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>    
}
于 2016-01-06T15:36:01.720 回答
1

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

@(text: String)

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

@title(text)

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

于 2016-01-06T11:30:17.560 回答