2016-02-25 1 views
4

I don't understand why this piece of code is working:<a jsf:rendered="#{...}"> is not interpreted as passthrough element

<h:link value="Login" rendered="#{sessionBean.userInSessionBean == null}" /> 

and this piece of code is not working:

<a jsf:rendered="#{sessionBean.userInSessionBean == null}">Login</a> 
+2

Вы пропустите, чтобы предоставить больше информации в качестве определения пространства имен, используемой версии JSF, браузеров, которые вы тестируете с помощью ... –

+0

@XtremeBiker Ни одна из этих вещей не имеет к этому никакого отношения. – EJP

+0

Вы правы @ XtremeBiker. Моя версия JSF - 2.2.12. Я пробовал Explorer, Chrome и Firefox. Я также использую Prime Faces 5.3. – Gavi

ответ

7

A HTML element will only become a passthrough element if following conditions are met:

  1. There's at least one jsf:xxx attribute от http://xmlns.jcp.org/jsf пространство имен.
  2. Существует, по крайней мере, один «identifying attribute», связанный с конкретным компонентом JSF.

Для <a> элемента идентификационный атрибут необходимо, чтобы JSF может решить, следует ли интерпретировать его как <h:commandLink>, <h:outputLink> или <h:link>. Без атрибута идентификации JSF не имеет понятия, какой компонент вы намеревались использовать, поэтому любые атрибуты jsf:xxx будут проигнорированы. jsf:rendered не является достаточным атрибутом идентификации, потому что он появляется на каждом отдельном компоненте JSF, поэтому JSF по-прежнему не знает, какой из них вы имели в виду.

Учитывая, что вы, похоже, имеете <h:link>, тогда используйте jsf:outcome в качестве идентификационного атрибута.

<a jsf:outcome="login" jsf:rendered="#{empty sessionBean.userInSessionBean}">Login</a> 

Совершенно другая альтернатива, чтобы обернуть простой HTML в <ui:fragment rendered>. См. Также How to conditionally render plain HTML elements like <div>s?

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