jsf установите ui:param или используйте значение, которое динамически изменяется в ui:repeat

Я хочу обновить значение ui:param или использовать что-то подобное в циклах ui:repeat с условием. Идея примерно следующая (приблизительно, не окончательная реализация, но думаю понятна):

<ui:param name="marginLeftNode" value="#{myBean.initialMarginValue}" />

<ui:repeat value="#{myBean.viewWrapper.linkMap.entrySet().toArray()}" var="map">
    <ui:repeat var="link" value="#{map.value}" varStatus="status">

        <li style="margin-left: #{marginLeftNode}%" class="ico-#{link.getStyleCss()}-ayuda">
            <a href="#{link.getUrlLink()}">#{link.getTitle()}</a>
        </li>

        <!-- Code conditions that doesn't works in any way as I've readed in the links after code -->
        <c:if test="#{marginLeftNode gt 4}">
            <ui:param name="marginLeftNode" value="#{myBean.viewWrapper.nodeList.get(status.index).depth}" />
        </c:if>
        <ui:fragment rendered="#{marginLeftNode gt 4}">
            <ui:param name="marginLeftNode" value="#{myBean.viewWrapper.nodeList.get(status.index).depth}" />
        </ui:fragment>
        <!-- End code conditions: these are the two solutions c:if and ui:fragmen I tried -->

    </ui:repeat>
</ui:repeat>

Я не могу использовать c:if внутри ui:repeat, потому что это не работает (Указать условный рендеринг элемента внутри ‹ui:repeat›? Кажется, ‹c:if› не работает), и я не могу использовать ui:fragment с ui:param, потому что это тоже не работает (определение условной переменной в JSF)

Итак, есть идеи, как это решить?


person dcalap    schedule 21.11.2014    source источник


Ответы (2)


Прежде всего, избегайте использования JSTL, если вы можете использовать JSF. Вот ответ, который объясняет, как JSTL и JSF выполняются на разных этапах -> https://stackoverflow.com/a/3343681/4253629

Например, чтобы условно переопределить ui:param, вы можете сделать это:

<ui:param
    name="marginLeftNode" 
    value="#{marginLeftNode gt 4 ? myBean.viewWrapper.nodeList.get(status.index).depth : marginLeftNode }"/>

Вероятно, существует другое решение, но это работает.

Привет

person Corus    schedule 21.11.2014
comment
Как/где ответ, который вы связали, говорит, что вы не должны использовать JSTL? - person kolossus; 23.11.2014
comment
Извините, может быть, правильное слово - избегать, а не не использовать (я изменил свой ответ). JSF и JSTL выполняются на разных этапах, вы можете использовать JSTL, но вы должны это учитывать. В JSF есть альтернативы JSTL, например, вместо c:if мы можем использовать атрибут rendered. Я думаю, вы должны использовать JSTL только в том случае, если вы не можете использовать JSF, но это только личное мнение. Кроме того, в предыдущих версиях JSF 2.2 существует ошибка, связанная с JSTL, которая изменяет область действия ваших резервных компонентов на область запроса, если вы используете теги JSTL. java.net/jira/browse/JAVASERVERFACES-1492 - person Corus; 23.11.2014

Изменение ui:param внутри цикла не имеет реальной ценности. Настоящая цель ui:param - передать переменные времени выполнения в клиент шаблона или включенный файл. К тому времени, когда ваш параметр будет передан, его изменение не имеет большого значения. Если все, что вам нужно, это условно изменить значение переменной после ее передачи, вы можете просто использовать JSTL c:set, чтобы установить переменную области страницы, которую затем можно использовать

   <ui:repeat value="#{myBean.viewWrapper.linkMap.entrySet().toArray()}" var="map">
   <ui:repeat var="link" value="#{map.value}" varStatus="status">

    <li style="margin-left: #{marginLeftNode}%" class="ico-#{link.getStyleCss()}-ayuda">
        <a href="#{link.getUrlLink()}">#{link.getTitle()}</a>
    </li>

        <c:if test="#{marginLeftNode gt 4}">
              <c:set var="marginLeftNode" value="#{myBean.viewWrapper.nodeList.get(status.index).depth}"/>   
        </c:if> 


</ui:repeat>

You could then access your set variable as #{marginLeftNode} anywhere within that view

person kolossus    schedule 21.11.2014