2016-11-25 57 views
8

Mam ogólny szablon w play 2.6, który chcę przekazać w zmiennej liczbie HtmlContent s. Mam zdefiniował template takiego (w tym dorozumiane parametru mam w wypadku, który zmienia wszystko):Scala Play szablon vararg HtmlContent

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

Na stronie szablonu, to działa fine-- mogę wnikliwie content z for i uczynić ją jak ja chcieć. Jednak nie byłem w stanie wymyślić czystej metody wywoływania zmiennych argumentów z podstawowego szablonu.

przykład, mam widok o nazwie "Baz":

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

W nim, staram się wywołać template z wieloma argumentami HTML. Próbowałem następujących czynności:

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

i różne inne permutacje, ale wewnątrz wspornika otaczającej wydaje się interpretować dosłownie wszystko jako pojedynczy parametr w HtmlContent vararg.

to jednak skończyło się pracując jako zamierzałem, przekazując wielokrotności HtmlContents:

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

tak, że działa, i mogę korzystać z potrójną cytowany interpolowana ciąg za duży Html block-- ale wydaje jak powinno być czystsze sposób to zrobić, a interpolacja ciąg jest niebezpieczna, ponieważ nie robi ucieczki html.

Czy można to zrobić za pomocą dołączonej składni {? Chciałbym dowiedzieć się więcej o tym, co faktycznie dzieje się na podstawowym poziomie, i jak gra analizuje i generuje HtmlContent w nawiasach.

+0

Twój 'html (...) "podejście wygląda dość czysto i jednoznacznie. [Kod źródłowy Twirl] (https://github.com/playframework/twirl) może być jednym z miejsc, w których można spróbować jeszcze bardziej pogłębić swoje pytanie. – wwkudu

+0

Jakieś komentarze na temat odpowiedzi, którą zamieściłem? –

Odpowiedz

2

więc rozważyć masz poniżej szablonu

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

Istnieją różne sposoby można nazwać ten szablon

Option # 1

to, co już pisał w pytaniu

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

Opcje # 2

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

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

Option # 3

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

Opcje # 4

To nie jest dokładnie taka sama opcja, ale wymaga zmiany w podpisie Template samego

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

A potem nazywając go jak poniżej

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

Option # 5

Wymaga to pliki kodu i został już odpowiedział na innym SO wątku

Paul Draper's odpowiedź na Why doesn't this pass multiple HTML parameters to template

+0

Jakieś wyjaśnienie sprawy w dół? Najlepiej skomentować to z pogardą –