在包含的导航菜单中将当前页面突出显示为活动链接

12

我在侧边栏中有一个静态菜单,我在每个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>

<li>中添加class="active"可以突出显示菜单。我该如何确保在JSF2中动态突出显示所选项目?

我知道PrimeFaces和RichFaces有现成的组件可以实现这一功能,但我想先尝试纯JSF 2解决方案。纯客户端JavaScript解决方案也可以接受。

3个回答

34

您可以按照以下方式在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>

不要一遍又一遍地复制粘贴相同的代码块。


5
谢谢BaluSC!如果没有你,新手如何使用JSF呢:-) 感谢您耐心回答所有这些初学者的问题... - Ravi S
谢谢,@BalusC,你总是拯救我们。现在是时候让Stack Exchange创建一个BalusC响应社区了。kkk - Ascension
谢谢@BalusC!! 这确实是一种额外的魔法,但如何使其与菜单和子菜单一起工作呢? - Spartan
@Spartan:Page 类有一个 List<Page> pages 属性,表示子页面。 - BalusC
@BalusC:那么关于条件"#{view.viewId eq page.viewId ? 'active' : ''}"以及如何从view.viewId获取两个参数,有什么想法吗? - Spartan
显示剩余3条评论

1

我使用了@BalusC的想法和他在12473461的另一个提示,但进行了一些修改

<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>

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>

一个简单的Facelet标签也足够了。 - stg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接