7

最初在这里发布并回答:

https://groups.google.com/forum/#!topic/play-framework/s-ufMIbLz3c

但是当我说:

<div>
 @if (request.uri == "/") { "Home Menu Selected" }
</div>

但我得到了:

'(' expected but ')' found.
4

3 回答 3

8

假设您在范围内有请求对象,遗憾的是您只需要删除“if”之后的空格。播放模板对间距非常敏感。尝试:

<div>
 @if(request.uri == "/") { "Home Menu Selected" }
</div>
于 2013-09-17T03:19:10.017 回答
7

您要实现的目标很常见,您试图通过将当前页面标记为活动来在菜单中显示当前页面。

解决方案 1

你确实可以做你上面所做的。在模板中添加几个带有字符串比较的 @if 条件。

@if(request.uri == "/"){ class="active" }

解决方案 2

但我喜欢在类型安全架构上走得更远一点。我通常创建一个包含很多常量的对象:

object MenuContants {
    val HOME = "HOME"
    val CONTACT = "CONTACT"
}

然后我在模板中给出这些常量。从子模板到主布局模板:

@main("The title of my page", MenuConstants.HOME) {
    // the rest of my template
}

然后在您的主模板中进行比较,但不再基于字符串而是基于常量,这是类型安全的。

@(title:String, contant:String) {
    @if(contant == MenuConstants.HOME) { class="active" }
}
于 2013-09-17T07:10:57.177 回答
0

回答问题

模板可用的隐式请求包含所有详细信息。适应问题中的示例,我将使用以下模板函数,该函数在 Play Framework 2.6 中进行了测试。它不需要维护枚举,但是在更新routes文件时您仍然可以保持安全,并且在重命名操作时会出现编译错误。

@*
  Usage:
  <div>
    @outputIf(routes.HomeController.index, "Home Menu Selected")
  </div>
*@
@outputIf(call:play.api.mvc.Call, text:String) = @{
  if (request.path.equals(call.path)) text else ""
}

文档

一些关于可重用块的文档: https ://www.playframework.com/documentation/2.6.x/ScalaTemplates#Declaring-reusable-blocks

play.api.mvc.Call API:https ://www.playframework.com/documentation/2.6.x/api/scala/index.html#play.api.mvc.Call

play.api.mvc.Request API:https ://www.playframework.com/documentation/2.6.x/api/scala/index.html#play.api.mvc.Request

我的意图(渲染导航)

我最近偶然发现了一个相关的问题,除了这篇文章之外,我在网络上没有发现任何特定于我的问题的东西,我想与你分享我的最终解决方案。

如果页面的当前 url 等于列表项的 url,我想用“活动”类呈现导航列表项,但我也不喜欢只比较 url 字符串是否相等,因为它可能会改变并且会不给出编译错误——我也不接受每次添加新导航项时创建和更新枚举(因为我有越来越多的导航项,包括孩子)。routes但是,在某些时候更改网址时,我仍然希望保持安全。main.scala.html在 Play Framework 2.6 中,我使用模板中的这个可重用函数解决了这个问题:

@*
  Renders a list item <li> with active-class containing a link element
  Usage:
  @navItem(routes.HomeController.index, "Home")
  @navItem(routes.HomeController.index, "Home", "nav-home")
  @navItem(routes.HomeController.index, "Home", activeClass="selected")
  @navItem(routes.HomeController.index, "<span>Home</span>", "nav-home nav-element", "selected active")
*@
@navItem(call:play.api.mvc.Call, linkContent:String, cls:String="", activeClass:String="active") = @{
  val hrefAttr = "href='"+call+"'"
  val classNames = if (request.path.equals(call.path)) activeClass + " " + cls else cls
  val classAttr = if(classNames.length>0) " class='"+classNames+"'" else ""
  val linkHtml = Html(linkContent)
  Html("<li"+classAttr+"><a "+hrefAttr+">"+linkHtml+"</a></li>")
}

如果请求主页,评论示例将呈现为以下内容:

<li class="active"><a href="/">Home</a></li>
<li class="active nav-home"><a href="/">Home</a></li>
<li class="selected"><a href="/">Home</a></li>
<li class="selected active nav-home nav-element"><a href="/"><span>Home</span></a></li>
于 2018-11-16T14:05:40.087 回答