【问题标题】:Render single Template (Play Framework)渲染单个模板(Play Framework)
【发布时间】:2013-12-26 19:07:12
【问题描述】:

我有几个关于模板的问题。我想我不明白他们是如何工作的。 假设我有一个网站,它由左侧的导航、中间的显示和带有附加导航的标题组成。 所以我有以下模板:

  • 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{
...
}

我怎样才能同时加载不同的显示和导航?

对不起,我的英语很糟糕,希望有人能帮助我,谢谢。

【问题讨论】:

  • 这些是Play 模板吗?标记对于确保正确的人看到您的问题很重要。

标签: scala templates playframework


【解决方案1】:

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

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

你马上就会明白为什么这会更好。现在您需要定义导航。但与其将导航包装到 main 中,不如自己定义导航:

@()
<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>
}

要记住的重要一点:自行定义您的 sn-ps。定义“骨架”(main.scala.html)并使用另一个模板将所有部分放在一起。

【讨论】:

  • 非常感谢!我会试试的:)
  • 嗨,我试过按照你的方式做。但现在我得到以下编译错误:“类型不匹配;找到:views.html.navigation.type required: play.api.templates.Html”。我的主要看起来像“@(navigation: Html, header: Html)(display: Html) some code...”我的索引看起来像@main(navigation, header){

    Hello

    }控制器我调用 index.render() 方法。
  • 好吧,我的错。您需要将模板称为函数。尝试改用@main(navigation(), header()){ ... }
猜你喜欢
  • 2012-08-20
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多