最初在这里发布并回答:
https://groups.google.com/forum/#!topic/play-framework/s-ufMIbLz3c
但是当我说:
<div>
@if (request.uri == "/") { "Home Menu Selected" }
</div>
但我得到了:
'(' expected but ')' found.
最初在这里发布并回答:
https://groups.google.com/forum/#!topic/play-framework/s-ufMIbLz3c
但是当我说:
<div>
@if (request.uri == "/") { "Home Menu Selected" }
</div>
但我得到了:
'(' expected but ')' found.
假设您在范围内有请求对象,遗憾的是您只需要删除“if”之后的空格。播放模板对间距非常敏感。尝试:
<div>
@if(request.uri == "/") { "Home Menu Selected" }
</div>
您要实现的目标很常见,您试图通过将当前页面标记为活动来在菜单中显示当前页面。
你确实可以做你上面所做的。在模板中添加几个带有字符串比较的 @if 条件。
@if(request.uri == "/"){ class="active" }
但我喜欢在类型安全架构上走得更远一点。我通常创建一个包含很多常量的对象:
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" }
}
回答问题
模板可用的隐式请求包含所有详细信息。适应问题中的示例,我将使用以下模板函数,该函数在 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>