2016-11-25 2 views
8

У меня есть общий шаблон в play 2.6, который я хочу передать в переменной сумме HtmlContent s. Я определил template как это (в том числе неявного параметра у меня есть в случае, когда меняется что-нибудь):Scala Play template vararg HtmlContent

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

На стороне шаблона, это работает fine-- я могу рассекать content с for и делают это, как я хотеть. Тем не менее, я не смог найти чистый способ для вызова аргументов переменной из базового шаблона.

например, у меня есть представление под названием «Баз»:

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

В ней я пытаюсь вызвать template с несколькими аргументами Html. Я попробовал следующее:

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

И другие различные перестановки, но внутри объемлющего кронштейна, кажется, интерпретировать все буквально как один параметр в HtmlContent vararg.

Однако, это в конечном итоге работает, как я предполагал, проходя в нескольких 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? Лучше всего прокомментировать с нисходящим –