Playframework 如何在Play框架的视图中排除可重用组件?

Playframework 如何在Play框架的视图中排除可重用组件?,playframework,views,Playframework,Views,我希望正确考虑我的观点,避免产生太多重复。我使用的是Play框架,我想要考虑的元素是基本的公共元素——页眉、页脚和导航元素 这种保理的标准模式是什么?当我读到视图继承特性时,它们听起来好像不允许重用组件 我正在使用Play的2.0版 比如说,我有一个多页面的通用布局,我希望有可交换的位——比如,中心内容位和页脚,我显示的不同页面有不同的页脚和内容组合。我可以想到两件事。第一种情况是,当您拥有页面的骨架,并且希望每个视图都填充该骨架的一个部分时,例如,这将是您的骨架: main.html: &l

我希望正确考虑我的观点,避免产生太多重复。我使用的是Play框架,我想要考虑的元素是基本的公共元素——页眉、页脚和导航元素

这种保理的标准模式是什么?当我读到视图继承特性时,它们听起来好像不允许重用组件

我正在使用Play的2.0版



比如说,我有一个多页面的通用布局,我希望有可交换的位——比如,中心内容位和页脚,我显示的不同页面有不同的页脚和内容组合。

我可以想到两件事。第一种情况是,当您拥有页面的骨架,并且希望每个视图都填充该骨架的一个部分时,例如,这将是您的骨架:

main.html:

<!DOCTYPE HTML>
<html>
    <head>
        <title>#{get 'title' /}</title>
    </head>
    <body>
        #{doLayout /}
    </body>
</html>
#{extends 'main.html' /}
#{set title:'Your title' /}

<div>
   Your content
</div>
<div id="footer">
   #{include 'Application/footer.html' /}
</div>
<span>This will be rendered inside the "footer" div</span>

#{获取“标题”/}
#{doLayout/}
这将是使用它的页面之一:

ex1.html:

<!DOCTYPE HTML>
<html>
    <head>
        <title>#{get 'title' /}</title>
    </head>
    <body>
        #{doLayout /}
    </body>
</html>
#{extends 'main.html' /}
#{set title:'Your title' /}

<div>
   Your content
</div>
<div id="footer">
   #{include 'Application/footer.html' /}
</div>
<span>This will be rendered inside the "footer" div</span>
#{扩展'main.html'/}
#{设置标题:'Your title'/}
你的内容
这样,您就不必担心所有常见的“包装器”代码,并且与在该示例中设置标题的方式相同,您还可以向标题添加样式表或javascript链接

第二种方法是让页面包含在单独模板中执行的代码段,以便可以重用它们:

example2.html:

<!DOCTYPE HTML>
<html>
    <head>
        <title>#{get 'title' /}</title>
    </head>
    <body>
        #{doLayout /}
    </body>
</html>
#{extends 'main.html' /}
#{set title:'Your title' /}

<div>
   Your content
</div>
<div id="footer">
   #{include 'Application/footer.html' /}
</div>
<span>This will be rendered inside the "footer" div</span>

#{包括'Application/footer.html'/}
footer.html:

<!DOCTYPE HTML>
<html>
    <head>
        <title>#{get 'title' /}</title>
    </head>
    <body>
        #{doLayout /}
    </body>
</html>
#{extends 'main.html' /}
#{set title:'Your title' /}

<div>
   Your content
</div>
<div id="footer">
   #{include 'Application/footer.html' /}
</div>
<span>This will be rendered inside the "footer" div</span>
这将在“footer”div中呈现

不确定从这样一个简单的解释中是否清楚何时使用哪一个,我认为一旦你得到了差异是很自然的,我一直都在使用这两者。

你应该使用所描述的
布局和
标签的组合

Layout
包装当前视图,因此它是开始和结束HTML结构、将脚本添加到HTML文档的
head
部分以及放置典型元素(例如带有徽标的稳定页眉、带有版权的页脚等)的最佳位置。如果您在所有页面上都有相同的主导航,您也可以将其放在布局中,然后,您可以将参数添加到布局视图中,以便轻松更改活动项的CSS类。请注意,如果示例中有两个不同版本的主导航(例如,一个用于普通用户,第二个仅用于管理员),则可以创建两个不同的布局或使用一个布局,并根据从初始视图传递的某些参数显示两个不同的版本

标记
用于将代码注入当前视图(因此它们的作用与布局正好相反)。它们是没有布局的常见视图,也是带有参数的函数。它们主要用于在每页甚至请求上放置正在更改的内容,例如通知框(来自文档:
success
error
,等等)。此外,它们对于次导航也很有用,特别是当主导航的每个“分支”上都有更改时,并且可能在某些页面上根本不应该显示

您还可以在
布局中使用
标记
(可能反之亦然),因此您可以看到,有许多可能性:)


注意:palako的示例很好地说明了这一点,但它是Play 1.x模板引擎、Play 2.x检查引用和/或Play源代码附带的示例应用程序的典型示例。

这些示例适用于Play 1.x模板系统。啊,是的。我还没有用过2.x。这部分也不向后兼容吗?是的,它也不兼容,Play 2.0提供了自己的基于Scala的模板引擎,它是完全类型化的,可能比Play 1中的这个编译引擎快得多。