Подтвердить что ты не робот

JSF: условно отобразить элемент списка (<li>)

Я просто унаследовал проект, реализованный в JSF. У меня есть следующий код, который отлично выглядит в Chrome, но Firefox отображает границы в "пустых" элементах списка:

<ul>
    <li><a href="/home">Home</li>
    <li>
        <s:link view="/signup.xhtml" rendered="#{someCondition}">Sign Up</s:link>
    </li>
    <!-- etc... -->
</ul>

Которое выглядит следующим образом:

enter image description here

Есть ли тег JSF для условного отображения <li>?

4b9b3361

Ответ 1

Нет li является ванильным html, а не компонентом jsf.

Вы можете взломать его, поместив <h:panelGroup /> вокруг элемента li и установив на нем свойство rendered.

т.

 <h:panelGroup rendered="#{someCondition}">
   <li>
      <s:link view="/signup.xhtml">Sign Up</s:link>
   </li>
 </h:panelGroup>

Другой вариант - использовать <f:verbatim rendered="#{someCondition}" >, но имейте в виду, что он устарел в JSF 2.0.

Ответ 2

Если вы сделаете это как в примере @CoolBeans, вы получите <span> вокруг вашего <li> . В некоторых случаях это может нарушить ваш макет, кроме того, вам не нужен дополнительный тег под <ul> . Чтобы избавиться от него, используйте <ui:fragment rendered="#{condition}" /> вокруг вашего элемента вместо < h: panelGroup > .

Также вы можете использовать атрибут стиля, чтобы скрыть элемент:

<li style="display: #{condition ? 'list-item' : 'none'};" />

Ответ 3

Вы также можете использовать базовую библиотеку JSTL:

<c:if test="#{someCondition}">
    <li>
        <s:link view="/signup.xhtml">Sign Up</s:link>
    </li>
</c:if>

Я думаю, что использование этого основного тега делает код более понятным, чем использование тега panelGroup.