2012-06-19 3 views
8

У меня есть статическое меню на боковой панели, которое я включаю на каждой странице 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 на стороне клиента.

ответ

27

Вы можете получить текущий вид ID в EL следующим

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

вместо copypasting один и тот же код над и более.

+4

Thank you BaluSC.! Что бы новички в JSF обошелись без вас :-) Цените свое терпение, отвечая на все эти вопросы noob ... –

+0

Добро пожаловать. – BalusC

+0

вы можете предложить некоторое решение, когда пункт меню обновляет частичную страницу через ajax. а не полная страница обновляется. Я могу сделать это с помощью обратного вызова javascript при щелчке по меню. но что может быть лучшим подходом. –

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

Здесь будет достаточно простого тега макета. – stg

Смежные вопросы