【问题标题】:How do you create a Scala collection of content in a Play template?如何在 Play 模板中创建 Scala 内容集合?
【发布时间】:2016-06-21 09:26:02
【问题描述】:

我确定我错过了显而易见的内容,但有没有办法创建 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] 尺寸的不良设计

【问题讨论】:

    标签: playframework scala-collections twirl playframework-2.5


    【解决方案1】:

    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>
    }
    

    【讨论】:

    • 这很接近,尽管我仍然希望传递多个内容块,因为每个选项卡可能有不同的布局。类似的东西:
    • 抱歉 - 无法添加格式化的 cmets - 上面已编辑问题
    • @geeforce 您能否使用该信息(格式正确)扩展您的问题
    • @geeforce 我再次扩展了答案。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多