如何在c:forEach循环中动态设置结束值并开始值?

时间:2012-10-10 15:35:13

标签: jsf facelets icefaces mojarra

下午好。

我有以下问题,属性值的结尾

<c: foreach should vary for each row in the datatable, eh trying with expression language but simply does not work.

这是代码:

<ace:dataTable  value="#{TreeTableBk.rubros}" var="rubro"
                paginator="true" paginatorPosition="bottom" rows="10" style="font-size: 12px; font-family: Tahoma, Verdana, Arial, Sans-Serif">
                <ace:column
                    headerText="Informacion">
                    <div align="left">
                    <h:panelGroup>
                        <c:forEach begin="0" end="#{rubro.nivel}">
                            <h:outputText value="__*"></h:outputText>
                        </c:forEach>
                        <h:inputText 
                        value      = "#{rubro.codigoPadre}"
                        rendered   = "#{rubro.final_ == 'N'}"
                        styleClass = "SMRInputTextNegrilla6" 
                        style      = "background-color:#A5CCE7">
                        </h:inputText>
                    <h:inputText 
                        value      = "#{rubro.codigoPadre}"
                        rendered   = "#{rubro.final_ == 'S'}"
                        styleClass = "SMRInputTextNegrilla6" >
                    </h:inputText>
                    <h:inputText 
                        value      = "#{rubro.codigo}"
                        styleClass = "SMRInputTextNegrilla6" 
                        style      = "background-color:#D1F2C7">
                    </h:inputText>
                    <h:inputText 
                        value      = "#{rubro.descripcion}"
                        styleClass = "SMRInputTextNegrilla6" >
                    </h:inputText>
                    <h:inputText value="#{rubro.nivel}" styleClass="SMRInputTextNegrilla6">
                    </h:inputText>
                    </h:panelGroup>
                    </div>
                </ace:column>
            </ace:dataTable>

任何想法如何解决这个问题都会有所帮助。

非常感谢

1 个答案:

答案 0 :(得分:1)

<c:forEach>之类的标记处理程序在构建视图期间运行,而不是在渲染视图期间运行。像<h:dataTable>这样的UI组件在渲染视图期间运行,而不是在构建视图期间运行。因此,在<c:forEach>运行的那一刻,<h:dataTable>并未运行,因此其var="rubro"在EL范围内永远不可用,因此#{rubro}<c:forEach>null 1}} 始终评估为<c:forEach>

因此,对于这个特定的功能要求,<ui:repeat>完全不可能。您最好的选择是使用begin。但是,这不支持end的{​​{1}}和<c:forEach>属性。但是,您可以创建一个custom EL function,创建一个给定大小的虚拟数组,然后将其提供给<ui:repeat value>

E.g。

<ui:repeat value="#{my:createArray(robro.nivel)}">
    <h:outputText value="__*" />
</ui:repeat>

public static Object[] createArray(int size) {
    return new Object[size];
}

JSF实用程序库OmniFaces具有of:createArray()函数,正是为了这个目的,另请参阅the of:createArray() showcase example

另见: