您好我想在JSF中显示树结构
我想插入
的意图<span class="intendWidth" />
这是我的jsf-code
<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次的任何想法?
答案 0 :(得分:5)
<c:forEach>
在视图构建时(XHTML转换为JSF组件树的那一刻)运行,而<ui:repeat>
在视图渲染时间(JSF组件树生成HTML输出的那一刻)运行
因此,当<c:forEach>
运行时,#{entityDepthHolder}
在EL范围内无处可用,并且评估为null
,在这种情况下隐式强制转换为0
。由于begin
也是0
且end
包含在内,因此您最终会得到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种方法可以解决这个问题:
在外部循环上使用<c:forEach>
代替<ui:repeat>
。警告是,这会破坏早于2.1.18的Mojarra版本中的视图范围内的bean。
在内循环上使用<ui:repeat>
代替<c:forEach>
。如果您碰巧使用JSF实用程序库OmniFaces,那么您可能会发现#{of:createArray()}
函数对此有用。
<ui:repeat value="#{of:createArray(entityDepthHolder.depth)}">