如何在 Play 模板中创建 Scala 内容集合?
How do you create a Scala collection of content in a Play template?
我确定我错过了显而易见的东西,但是有没有办法创建一个 Html 对象的集合以传递给像 @(title: String)(content: Seq(Html))
这样的 Play 模板?我正在尝试动态生成一组标签页,其中每个 Html 对象都是标签的主体。
我的困惑在于如何在模板中创建 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="fixed-tab-@tab.id">
<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]
尺寸的不良设计
就您的目的而言,单个参数列表应该可以正常工作。
@(title: String, contents: Seq[String])
您可以在 play framework website 上找到更多信息。
Compiled Play 模板基本上只是函数(或者更确切地说,是具有 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>
}
我确定我错过了显而易见的东西,但是有没有办法创建一个 Html 对象的集合以传递给像 @(title: String)(content: Seq(Html))
这样的 Play 模板?我正在尝试动态生成一组标签页,其中每个 Html 对象都是标签的主体。
我的困惑在于如何在模板中创建 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="fixed-tab-@tab.id">
<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]
尺寸的不良设计
就您的目的而言,单个参数列表应该可以正常工作。
@(title: String, contents: Seq[String])
您可以在 play framework website 上找到更多信息。
Compiled Play 模板基本上只是函数(或者更确切地说,是具有 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>
}