回答问题
模板可用的隐式请求包含所有详细信息。适应问题中的示例,我将使用以下模板函数,该函数在 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 网址时,我仍然希望保持安全。
在 Play Framework 2.6 中,我使用 main.scala.html 模板中的这个可重用函数解决了这个问题:
@*
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>