2016-03-07 77 views
0

我確定我錯過了顯而易見的,但有沒有辦法創建一個Html對象的集合傳遞給播放模板,如@(title: String)(content: Seq(Html))?我正在嘗試動態生成一組標籤頁,其中每個Html對象都是該標籤的主體。如何在Play模板中創建一個Scala內容集合?

我的困惑在於如何在模板中創建Seq(Html)。 類似@main("Home") Seq({...},{...})不起作用,並使用@(title: String)(contentTab1: Html)(contentTab2: Html)@main("Home") {...}, {...}擊敗的目的。

喜歡的東西:

選項卡的內容(tab.scala.html):

@(content: Html, tab: models.Tab, isActive: String) 
<section class="mdl-layout__tab-panel @isActive" id="[email protected]"> 
     <div class="page-content">@content</div> 
</section> 

主要模板(main.scala.html):

@main(title: String, tabs: List[models.Tab])(contentSeq: Seq[Html]) 

頁面模板:

@(tabs: List[models.Tab]) 
@main("title", tabs) { 
    <!-- tab1 content --> 
} { 
    <!-- tab2 content --> 
} 

*忽略不匹配的匹配設計Seq[Html]List[models.Tab]尺寸

回答

1

編譯播放模板基本上只是函數(或者更確切地說,與apply(...)方法的對象),所以假設你有標籤內容單一(部分)的模板,您可以在使用map,例如,僅僅適用於標籤數據:

主要模板(main.scala.html):

@main(title: String, tabs: Seq[Html])(content: Html) 

<h1>@title</h1> 
<ul class="tabs"> 
    @tabs.map { tab => 
    @tab 
    } 
</ul> 
@content 

選項卡的內容(tab.scala.html):

@(name: String) 

<li>@name</li> 

因此,每個頁面模板看起來是這樣的:

@(title: String) 

@main(title, Seq("tab1", "tab2", "tab3").map(name => views.html.tab(name)) { 
    <p>This is some content</p> 
} 

...或者,如果你有一個以上的標籤部分:

@main(title, Seq(views.html.tab1("tab1"), views.html.tab2("tab2"))) { 
    <p>This is some content</p> 
} 

還有一種方法是使每個標籤作爲一個reusable block和它們傳遞到主模板作爲一個序列:

@(title: String) 

@tab1 = { 
    <li>Content for tab 1</li> 
} 

@tab2 = { 
    <li>Content for tab 2</li> 
} 

@main(title, Seq(tab1, tab2)) { 
    <p>This is some content</p> 
} 
+0

這是接近的,但我還是很希望能傳遞多個內容塊的每個標籤可以有不同的佈局。如: – geeforce

+0

對不起 - 無法添加格式化的評論 - 編輯上面的問題 – geeforce

+0

@geeforce你可以擴大你的問題與該信息(正確格式) – Mikesname

0

出於您的目的,它看起來像單個參數列表應該可以正常工作。

@(title: String, contents: Seq[String]) 

您可以在play framework website找到更多的信息。

相關問題