Используйте c: установить внутри пользовательского интерфейса: повтор не работает - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть приложение JSF 2 со следующим кодом:

<c:set var="number" value="0" scope="view" />
<ui:repeat value="${items}" var="item" varStatus="itemIndex">
    <c:if test="${item.boolProperty == true}">
        <c:set var="number" value="${number + 1}" scope="view" />
    </c:if>
    <h:outputText value="#{item.name}" />: <h:outputText value="#{number}" />
</ui:repeat>

Я хочу увеличить число в зависимости от свойства элемента в цикле.Однако условие, похоже, не работает, так как значение number всегда остается равным 0. Если я удаляю условие, number увеличивается только один раз или всегда увеличивается до 0, поэтому выводит 1. Может ли оновозможно ли изменение number var, чтобы не повлиять на number var, находящийся вне цикла?Я считаю, что атрибут scope об этом позаботится.

1 Ответ

2 голосов
/ 05 декабря 2011

Теги JSTL и компоненты JSF не работают синхронно, как вы ожидаете от кодирования. Теги JSTL выполняются во время построения представления JSF, в то время как компоненты JSF запускаются во время визуализации представления JSF. См. Также подробное объяснение JSTL в JSF2 Facelets ... имеет смысл?

То, чего вы хотите достичь, к сожалению, невозможно с компонентами JSF. <ui:param> подходит близко, но он функционирует просто как псевдоним для более сложного выражения EL, в то время как <c:set> фактически устанавливает что-то в желаемой области (область действия view, которая у вас там, кстати, неверна) ,

Лучше всего поменять модель или обернуть модель в другую модель, чтобы в итоге вы получили

<ui:repeat value="${items}" var="item" varStatus="itemIndex">
    <h:outputText value="#{item.name}" />: <h:outputText value="#{item.number}" />
</ui:repeat>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...