玩!框架模板参数组

时间:2014-12-23 18:27:40

标签: playframework playframework-2.3

我一直在阅读Play上的文档!网站,无法查看它在哪里解释了什么参数组以及它们将用于什么。

有什么区别:

@(title: String)(user: User)

@(title: String, user: User)

如果有人可以帮助我,我们将非常感激。

1 个答案:

答案 0 :(得分:1)

正如@mgosk在评论中建议的那样,多个参数列表是Scala函数的标准功能,Google可以比我更好地回答这个问题。

关于特别是播放模板,但它们非常有用。

TLDR 播放模板中的参数组对以下内容非常有用:

  • 将隐式参数传递给模板(来自操作和父模板)
  • 提供了一种通过Scala块调用语法包装内容的好方法

您可能使用它们的一个原因是将隐式参数传递给视图。隐式参数由编译器添加到调用站点,并且作为spec points out,它们必须在最后(或唯一)参数列表中标记为,例如:

@(title: String)(implicit request: RequestHeader)

<h1>@title</h1>

The path is for this request is <b>@request.path</b>.

从动作中调用该模板时,只要有一个范围(see here for more details on that),您就不必明确提供请求标头。

模板中多个参数列表的另一个非常有用的用途是&#34;包装&#34;内容,特别是考虑到可以使用braces instead of parenthesis调用Scala函数。假设您有一些部分模板,例如代表几个不同的小部件,但这些模板总是被相同的样板HTML包围。然后,您可以创建一个模板包装器(称为widgetWrapper.scala.html),如下所示:

@(name: String)(details: Html)

<div class="item">
  <div class="item-name">@name</div>
  <div class="item-body">
    @details
  </div>
</div>

可以这样调用:

@(item: WidgetA)

@widgetWrapper(item.name) {
  <ul class="item-details">
    <li>@item.detail1</li>
    <li>@item.detail2</li>
  </ul>
}

最后一种技术是如何定义标准化的&#34;页面镀铬&#34;或网站,例如(文件standardLayout.scala.html):

@(title: String)(content: Html)(sidebar: Html)

<html>
  <head>
    <title>@title</title>
  </head>
  <body>
    <header>
      <h1>@title</h1>
    </header>
    <article>@content</article>
    <aside>@sidebar</aside>
  </body>
</html>

像这样使用:

@()

@standardLayout("My Page on Goats") {
  <p>
    Lots of text about goats...
  </p>
} {
   <ul class="sidebar-links">
     <li><a href="https://en.wikipedia.org/wiki/Goat">More about goats!</li>
   </ul>
}

正如您所看到的,两个大括号分隔部分中的内容将作为Twirl Html传递给布局模板,分别为主要内容和侧边栏(标题在第一个参数中传递为字符串)。

多个参数组可以实现这种便利。