Play框架2:呈现父模板内容的正确方法是什么?

时间:2014-03-28 10:18:04

标签: scala playframework-2.0

通常,当模板使用继承时,可以呈现父模板的内容。例如,在Twig

{% extends "base.html" %}

{% block sidebar %}
    {{ parent() }}
    ...
{% endblock %}

这意味着如果我有时不需要父模板的内容,我只需删除parent()函数。如何在Scala模板中实现此目的?

3 个答案:

答案 0 :(得分:2)

您可以先在 视图中创建HTML块,然后将其传递给父级( 布局 ) :

@sidebar = {
    <div>MySidebar</div>
}

@parent(sidebar){
    <div>Main content of the child view</div>
}

因此,在parent.scala.html布局中,您将使用它,就像

一样
@(sidebar: Html = null)(content: Html)

<div id="parent-wrap">
    @sidebar
    @content
</div>

当然,如果你要为许多子页面使用相同的HTML代码,那么如果你在每个视图中使用标记而不是声明@sidebar块,那么你会做得更好。请记住,标签只不过是一个scala视图(模板),您可以将其包含在任何其他视图中。只需在app/views/tags中创建一个普通的视图,即:sidebar.scala.html,并带有必需的HTML块,以便稍后在以下地方使用它:

<div class="span3">@tags.sidebar("content to pass")</div>

或作为传递到更高级别布局等的块:

@parent(tags.sidebar(additionalContent)){
    <div>Main content of the child view</div>
}

TBH我从来不知道包含视图和标签之间的区别;)

答案 1 :(得分:1)

嗯,观点只是游戏中的功能。您无法继承它们,但可以轻松定义可重用块:

@parent() = {
    ...
}

然后在任何地方重复使用它:

<div ....sidebar>
  @parent()
</div>

工作示例如下所示:

<强> base.scala.html

@(title: String)(content: Html)
<html>
    <head><title>@title</title></head>
    <body>
        <div class=...>@content</div>
    </body>
</html>

<强> index.scala.html

@(someParam: String)

@base("index") {
    <h1>@someParam</h1>
}

如果您不需要索引页面来分享基本行为 - 请不要使用@base

<强> index.scala.html

@(someParam: String)

...some other content
@someParam
...more content

答案 2 :(得分:1)

像这样:

<强> parent.scala.html

@(title: String)(content: (() => Html) => Html) {
<div class="parent">
  <h2>@title</h2>
  @content { () =>
    <p>This is the parents optional contribution to the sidebar.</p>
  }
</div>

<强> child.scala.html

@parent("Some title") { parentSidebar =>
  <p>Blah blah blah.</p>
  <div class="sidebar">
    ...
    @parentSidebar()
  </div>
}

因此父接受一个带有返回HTML的函数的函数。

相关问题