【问题标题】:Reusable functions between templates in Play Framework templatesPlay Framework 模板中模板之间的可重用函数
【发布时间】:2016-01-06 11:15:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: scala playframework-2.0 scala-template


    【解决方案1】:

    至少有几种解决方案:

    First 使用 tags,正如 Makis 向您展示的那样,在大多数情况下没关系,即使它添加了额外的空行也没关系(至少在我们正在讨论生成 HTML sn-ps 即表示列表中重复的新闻项目) - 如果您关心传输率,您可以在后期处理中优化/压缩您的 HTML。

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

    第三种方法是使用自己的 TemplateMagic-like 方法,它允许您扩展任何类型的对象并对其执行一些逻辑,很好示例是"active".when(someCondition) 语法,你可以看到它已经完成in the repo。当然,您只需要像这样创建自定义类并在视图开始时将其导入。另请记住,它不需要只有一个 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>    
    }
    

    【讨论】:

    • 在第二种情况下,我认为这些方法可以返回例如一个字符串。在那种情况下,我不需要使用 Html() 来避免转义。
    • 顺便说一句,问题是关于在模板中具有可重用功能 - 看起来不可能拥有它。我认为你应该在提到如何克服这个问题之前把它放在答案中。
    【解决方案2】:

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

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

    然后你可以在你的模板中随意使用它。

    【讨论】:

    • 但结果将包含所有出现在 title.scala.html 中的新行。有没有办法避免这种情况?
    • 不,我不这么认为,不是用这种方法,但是空格不应该影响你的 html 页面的外观。
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多