<c:foreach>随机加倍第一个或最后一个项目 - 这是一个已知错误吗?

时间:2017-11-02 13:22:19

标签: jsf jstl richfaces

我现在花了大约3个小时用以下代码片段调试一个奇怪的行为。我正在使用动态<rich:dataTable><c:forEach>在运行时包含一组不断变化的<rich:column>元素。

这在9/10案件中完美无缺。 但有时候第一列或最后一列会加倍。看一下以下细分示例:

<f:subview id="sv-#{delegate.uuid}">

    <rich:dataTable value="#{TabellenDelegateHelper.findRowsTabelle(delegate)}" var="row" rows="#{TabellenDelegateHelper.map(delegate).rows}">
        <rich:column>
            <f:facet name="header">
                <h:outputText value="Fixed Column" />
            </f:facet>
        </rich:column>

        <c:forEach var="theColumn" items="#{TabellenDelegateHelper.findColumns(delegate)}" varStatus="loop">
            <rich:column>
                <f:facet name="header">
                    <h:outputText value="#{theColumn}" />
                </f:facet>
                <!-- stripped dynamic content -->
            </rich:column>
        </c:forEach>
    </rich:dataTable>

</f:subview>

使用以下代码段将该代码包含在多个视图中:

<ui:include src="/WEB-INF/templates/shared/tabelle.xhtml">
    <ui:param name="delegate" value="#{myTable}" />
</ui:include>

在调试甚至使用简单的System.out.println(...)语句时,TabellenDelegateHelper.findColumns(delegate)返回的集合总是包含预期的(不是加倍的)元素。

为了进一步调查,我在表格之后添加了一些标签:

<c:forEach var="theColumn" items="#{TabellenDelegateHelper.findColumns(delegate)}" varStatus="loop">
    <h:outputText value="#{theColumn}, " />
</c:forEach>
<br/>
<ui:repeat var="theColumn" value="#{TabellenDelegateHelper.findColumns(delegate)}" varStatus="loop">
    <h:outputText value="#{theColumn}; " />
</ui:repeat>

这两个循环产生不同的结果:

Example Image

以前有没有人经历过这个?我不相信JSTL Core是错误的...但到目前为止我没有其他线索。

更奇怪的是......如果我颠倒顺序并在<ui:repeat>之前附加<c:forEach>集合是正确的,即使上表显示了错误。在<c:forEach> <ui:repeat>之前<c:forEach>使用COLUMNS,第一个被破坏,第二个+第三个输出正确。

为了使它更加详细......以下private static final String COL_FIRSTNAME = "firstname"; private static final String COL_LASTNAME = "lastname"; private static final String COL_TEAM = "team"; private static final String COL_POSITION = "position"; private static final String COL_ASSIGNMENT = "Aktion"; private static final List<String> COLUMNS = Arrays.asList(COL_FIRSTNAME, COL_LASTNAME, COL_TEAM, COL_POSITION, COL_ASSIGNMENT); 是方法返回的:

{
    "app_Welcome": "Welcome",
    "app_Notifications": "Notifications",
    "app_New": "New"
}

0 个答案:

没有答案