2016-11-25 73 views
8

我有一个通用模板play 2.6,我想通过一个可变金额HtmlContent s。我已经定义了template这样的(包括隐含参数我在的情况下,改变任何东西):斯卡拉发挥模板vararg HtmlContent

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

在模板上,这个工程fine--我可以解剖contentfor,并使其为我想。然而,我还没有找到一种干净的方式来调用基础模板中的变量参数。

e.g,我有一个名为 “巴兹” 的观点:

@(something: String)(implicit bar: Bar) 

在这里面,我试着用多个HTML参数来调用template。我已经试过如下:

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

和其他各种排列组合,而是一个封闭的支架内似乎字面解释一切,在HtmlContent可变参数一个参数。

然而,这结束了工作,我打算,通过在多个HtmlContents

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

这样的作品,我可以用三引号内插字符串一个大的HTML block--但似乎就像应该有一个更干净的方法来做到这一点,字符串插值是危险的,因为它不会做html转义。

有没有办法使用{封闭的语法来做到这一点?我想更多地了解底层关卡上实际发生的情况,以及如何在括号中解析并生成HtmlContent。

+0

你'的Html (...)'方法对我来说看起来相当干净和明确。尽管如此,[Twirl源码](https://github.com/playframework/twirl)可能是一个试图进一步挖掘你的问题的地方。 – wwkudu

+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

+0

downvote的任何解释?最好用downvote评论 –