Scala Play模板vararg HtmlContent

时间:2016-11-25 18:45:42

标签: html scala playframework variadic-functions twirl

我在play 2.6中有一个通用模板,我希望传递可变数量的HtmlContent s。我已经像这样定义了template(包括我改变任何内容时的隐含参数):

@(foo: String)(content: Html*)(implicit bar: Bar)

在模板方面,这很好用 - 我可以用content剖析for并按我的意愿渲染它。但是,我还没有找到一种从基础模板调用变量参数的简洁方法。

例如,我有一个名为" Baz":

的视图
@(something: String)(implicit bar: Bar)

在其中,我尝试使用多个Html参数调用template。我尝试过以下方法:

@template("fooString"){{123},{abc}}
and
@template("fooString")({123}, {abc})
and
@template("fooString"){{123}, {abc}})

以及其他各种排列,但在一个封闭的括号内,它似乎将所有内容都解释为HtmlContent vararg中的单个参数。

然而,这最终按照我的预期工作,传递了多个HtmlContents

@template("fooString")(Html("123"), Html("abc"))

这样可行,我可以使用三引号内插字符串作为一个大的Html块 - 但似乎应该有一个更简洁的方法来做到这一点,并且字符串插值是危险的,因为它没有'做html逃脱。

有没有办法使用{附带的语法执行此操作?我想更深入地了解基础层面上实际发生的事情,以及如何在括号中解析和生成HtmlContent。

1 个答案:

答案 0 :(得分:2)

因此,请考虑您有以下模板

// main.scala.html
@(title: String)(contents: Html*)

您可以通过不同的方式调用此模板

选项#1

这是您已在问题中发布的内容

@main("This is a title")(Html("abc"), Html("123"))

选项#2

@html1 = {
    Hello
}
@html2 = {
    <div>Tarun</div>
}

@main("This is a title")(html1, html2)

选项#3

@main("This is a title")(Html(<div>Tarun
</div>.toString), Html(<div>
Lalwani
</div>.toString))

选项#4

这不是完全相同的选项,但需要更改模板签名本身

@(title: String)(contents: List[String])  

然后将其称为下面的

@main("This is a title")(List(
  """<div>
     Tarun
    </div>
  """, """Hello"""))

选项#5

这需要代码文件,并已在另一个SO线程

上得到解答

Paul Draper's回答Why doesn't this pass multiple HTML parameters to template