通常,当模板使用继承时,可以呈现父模板的内容。例如,在Twig
:
{% extends "base.html" %}
{% block sidebar %}
{{ parent() }}
...
{% endblock %}
这意味着如果我有时不需要父模板的内容,我只需删除parent()
函数。如何在Scala
模板中实现此目的?
答案 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的函数的函数。