2016-11-25 61 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評論 –