Scala播放模板vararg HtmlContent

Nat*_*han 8 html scala variadic-functions playframework twirl

我有一个通用模板play 2.6,我希望传递可变数量的HtmlContents.我已经定义了template这样的(包括我改变任何东西的隐含参数):

@(foo: String)(content: Html*)(implicit bar: Bar)
Run Code Online (Sandbox Code Playgroud)

在模板上,这个工程fine--我可以解剖contentfor和渲染它,因为我想要的.但是,我还没有找到一种从底层模板调用变量参数的简洁方法.

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

@(something: String)(implicit bar: Bar)
Run Code Online (Sandbox Code Playgroud)

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

@template("fooString"){{123},{abc}}
and
@template("fooString")({123}, {abc})
and
@template("fooString"){{123}, {abc}})
Run Code Online (Sandbox Code Playgroud)

和其他各种排列,但在一个封闭的括号内,它似乎将字面上的所有内容解释为HtmlContentvararg中的单个参数.

然而,这最终按照我的意图工作,传递了多个HtmlContents:

@template("fooString")(Html("123"), Html("abc"))
Run Code Online (Sandbox Code Playgroud)

这样可以工作,我可以使用三引号内插字符串作为一个大的Html块 - 但似乎应该有一个更简洁的方法来执行此操作,并且字符串插值是危险的,因为它不会执行html转义.

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

Tar*_*ani 2

所以考虑你有下面的模板

// main.scala.html
@(title: String)(contents: Html*)
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式调用此模板

选项1

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

@main("This is a title")(Html("abc"), Html("123"))
Run Code Online (Sandbox Code Playgroud)

选项#2

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

@main("This is a title")(html1, html2)
Run Code Online (Sandbox Code Playgroud)

选项#3

@main("This is a title")(Html(<div>Tarun
</div>.toString), Html(<div>
Lalwani
</div>.toString))
Run Code Online (Sandbox Code Playgroud)

选项#4

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

@(title: String)(contents: List[String])  
Run Code Online (Sandbox Code Playgroud)

然后像下面这样调用它

@main("This is a title")(List(
  """<div>
     Tarun
    </div>
  """, """Hello"""))
Run Code Online (Sandbox Code Playgroud)

选项#5

这需要代码文件,并且已经在另一个 SO 线程上得到了回答

Paul Draper对Why does this pass multiple HTMLparameters to template的回答