2

嗨,我正在尝试在 JSF 中显示树结构

我想插入

<span class="intendWidth" />

这是我的 jsf 代码

<ui:repeat value="#{myHandler.entityTree}" var="entityDepthHolder">
    <p:commandLink action="#{myHandler.toggle(entityDepthHolder.entity)}">
        <div>
            <c:forEach begin="0" end="#{entityDepthHolder.depth}">
                <span class="intendWidth" />
            </c:forEach>
            #{entityDepthHolder.depth} #{entityDepthHolder.entity.title}
        </div>
    </p:commandLink>
</ui:repeat>

但由于某种原因 c:forEach 总是运行一次,虽然只有一个 entityDepthHolder.depth 为 1,其他所有为 0

任何想法如何在没有 c:forEach 的情况下插入标签 n 次?

4

1 回答 1

5

<c:forEach>视图构建期间运行(XHTML 变成 JSF 组件树的那一刻),而<ui:repeat>在视图渲染期间运行(JSF 组件树产生 HTML 输出的那一刻)。

因此,当<c:forEach>运行时,#{entityDepthHolder}EL 范围内无处可用,并且计算结果为null,在这种情况下,隐式强制为0. 由于beginis also0和 the endis inclusive,您实际上最终得到了 1 个项目。

在视图构建时间之后,JSF 组件树最终如下所示:

<ui:repeat value="#{myHandler.entityTree}" var="entityDepthHolder">
    <p:commandLink action="#{myHandler.toggle(entityDepthHolder.entity)}">
        <div>
            <span class="intendWidth" />
            #{entityDepthHolder.depth} #{entityDepthHolder.entity.title}
        </div>
    </p:commandLink>
</ui:repeat>

在视图渲染期间,重复生成相同的 HTML。

您有 2 个选项来解决此问题:

  1. 在外循环上使用<c:forEach>而不是。<ui:repeat>需要注意的是,这会破坏早于 2.1.18 的 Mojarra 版本中的视图范围 bean。

  2. 在内部循环中使用<ui:repeat>而不是。<c:forEach>如果您碰巧使用 JSF 实用程序库OmniFaces,那么您可能会发现该#{of:createArray()}功能对此很有帮助。

    <ui:repeat value="#{of:createArray(entityDepthHolder.depth)}">
    

也可以看看:

于 2013-07-31T12:08:49.303 回答