0

我确定我错过了显而易见的事情,但是有没有办法创建 Html 对象的集合以传递给 Play 模板,例如@(title: String)(content: Seq(Html))?我正在尝试动态生成一组选项卡页,其中每个 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]尺寸的不良设计

4

2 回答 2

1

编译后的 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>
}

另一种方法是将每个选项卡呈现为可重用块并将它们作为序列传递给主模板:

@(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>
}
于 2016-03-07T18:08:58.737 回答
0

出于您的目的,看起来单个参数列表应该可以正常工作。

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

您可以在播放框架网站上找到更多信息。

于 2016-03-07T18:03:13.693 回答