Play Framework模板中模板之间的可重用功能

时间:2016-01-06 11:15:54

标签: scala playframework-2.0 scala-template

在模板内部的Play Framework中,我可以定义类似的函数:

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

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

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

2 个答案:

答案 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)

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