jsf set ui:param或使用在ui:repeat中动态变化的值

时间:2014-11-21 11:30:28

标签: jsf jsf-2 conditional param uirepeat

我想更新ui:param值或在ui中使用类似的东西:使用条件重复循环。这个想法如下(只是一个aprox,而不是最终的实现,但我想是可以理解的):

<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 if ui:repeat因为不起作用(Specify conditional rendering of element inside <ui:repeat>? The <c:if> does not seem to work)而且我不能使用ui:fragment和ui:param,因为它也不起作用({{ 3}})

那么,任何想法如何解决?

2 个答案:

答案 0 :(得分:1)

首先,如果可以使用JSF,请避免使用JSTL。这是一个解释如何在不同的步骤中执行JSTL和JSF的答案 - &gt; https://stackoverflow.com/a/3343681/4253629

要有条件地重新定义一个ui:param,例如,你可以这样做:

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

可能存在另一种解决方案,但这有效。

问候

答案 1 :(得分:0)

更改循环内的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>

然后,您可以在该视图中的任何位置访问您的设置变量#{marginLeftNode}