玩框架2:什么是渲染父模板的内容的正确方法?(Play framework 2 : What is

2019-10-19 17:00发布

通常情况下,当一个模板使用继承,它可能使父模板的内容。 例如,在Twig

{% extends "base.html" %}

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

这意味着,如果我有时不需要父模板的内容,我只是简单地删除parent()函数。 我怎样才能做到这一点Scala模板?

Answer 1:

您可以先创建在视图中的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在每个视图块。 请记住,标签是没有什么更多的则只是一个阶视图(模板),你可以把它作为任何其他视图。 只要创建一个普通视图 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我从来不知道什么是包括视图和标签之间的区别;)



Answer 2:

那么,观点都只是在播放功能。 你不能继承他们,但你可以很容易地定义可重复使用的模块:

@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


Answer 3:

像这样:

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功能。



文章来源: Play framework 2 : What is a proper way to render the contents of parent template?