我在侧边栏中有一个静态菜单,我在每个JSF页面中都包含这个菜单。菜单看起来像这样:
<li class="nav-header">Item 1</li>
<li class="active"><a href="index.xhtml">Item 2</a></li>
<li><a href="new_workload.xhtml">Item 3</a></li>
<li><a href="import_workload.xhtml">Item 4</a></li>
向class="active"
添加<li>
会突出显示该菜单。如何确保在JSF2中动态突出显示所选项?
我知道PrimeFaces和RichFaces都有现成的组件,但我想首先尝试一个纯JSF 2解决方案。纯客户端JavaScript解决方案也是可以接受的。
答案 0 :(得分:30)
您可以按如下方式获取EL中的当前视图ID
#{view.viewId}
所以,这应该做
class="#{view.viewId eq '/index.xhtml' ? 'active' : ''}"
在某些List<Page>
中保留所有这些链接会更容易,这样您就可以执行类似
<li class="nav-header">#{menu.header}</li>
<ui:repeat value="#{menu.pages}" var="page">
<li class="#{view.viewId eq page.viewId ? 'active' : ''}">
<h:link value="#{page.title}" outcome="#{page.viewId}" />
</li>
</ui:repeat>
而不是一遍又一遍地复制同一段代码。
答案 1 :(得分:1)
我在12473461使用了@BalusC的想法加上他的另一个提示,但进行了一些修改:
<ul>
<li class="#{view.viewId eq '/admin/index.xhtml' ? 'active' : ''}"><h:link value="Main" outcome="main"/></li>
<li class="#{fn:startsWith(view.viewId, '/admin/sess1/') ? 'active' : ''}"><h:link value="Session 1" outcome="sess1"/></li>
<li class="#{fn:startsWith(view.viewId, '/admin/sess2/') ? 'active' : ''}"><h:link value="Session 2" outcome="sess2"/></li>
<li class="#{fn:startsWith(view.viewId, '/admin/sess3/') ? 'active' : ''}"><h:link value="Session 3" outcome="sess3"/></li>
</ul>
答案 2 :(得分:0)
我的解决方案基于自定义组件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:c="http://java.sun.com/jsp/jstl/core" >
<composite:interface>
<composite:attribute name="outcome" />
<composite:attribute name="label" />
</composite:interface>
<composite:implementation>
<li class="menuItem #{view.viewId == cc.attrs.outcome ? 'active' : ''}">
<h:outputText value="#{cc.attrs.label}" rendered="#{view.viewId eq cc.attrs.outcome}"/>
<h:link outcome="#{cc.attrs.outcome}" value="#{cc.attrs.label}" rendered="#{view.viewId ne cc.attrs.outcome}" />
</li>
</composite:implementation>
</html>
用于代码:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:my="http://java.sun.com/jsf/composite/my">
...
<ul class="nav">
<my:menuItem outcome="/home.xhtml" label="Home" />
</ul>