渲染单个模板(Play Framework)

时间:2013-12-09 15:42:32

标签: scala templates playframework

我有一些关于模板的问题。我想我并不完全明白它们是如何工作的。 假设我有一个网站,其中包括左侧的导航,中间的显示和带有附加导航的标题。 所以我有以下模板:

  • main.scala.html
  • navigation.scala.html
  • header.scala.html
  • display.scala.html

main.scala.html包含网站的一般结构。它将导航,标题和显示作为参数。所以主要的第一行是:

@(navigation: html)(header: html)(display: html)

我是对的吗?

如果我想查看整个页面,我只需在控制器中调用ok(main.render())

但是,如何更改网站上的导航?当我创建一个新模板时,我们称之为newNavigation.scala.html并在我的控制器中调用ok(newNavigation.render()),我会遇到问题,我只将newNavigation模板传递给main,而主要错过了标题和显示器。

导航模板以及标题和显示如下所示:

@main{
...
}

如何在同一时间加载不同的显示和导航?

我很抱歉我的英语,我希望有人可以帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

您需要以相反的方式包装模板。您的main.scala.html是一个很好的起点。但你宁愿想要像

这样的签名
@(navigation: html, header: html)(display: html)

你会明白为什么那会在一秒钟内更好地发挥作用。现在您需要定义导航。但是,不是将导航包装到主要内容中,而是单独定义导航:

@()
<ul> <li> ... </li> </ul>

对标题执行相同操作。之后,您可以创建一个index.scala.html,它将把所有部分组合在一起:

@(someName: String)
@main(navigation(), header()){
  <h1>Hello @someName</h1>
}

在其他模板中,您可以使用其他导航栏。让我们创建一个goodby.scala.html:

@(someName: String)
@main(newNavigation(), header()){
  <h1>Goodby @someName</h1>
}

您还可以使导航动态化并将其传递到模板中:

@(someName: String, customNavigation: html)
@main(customNavigation(), header()){
  <h1>...</h1>
}

要记住的重点:自己定义代码段。定义“skeleton”(main.scala.html)并使用另一个模板将所有部分组合在一起。