我想动态选择一个facelet来渲染我的数据列表中的一些项目。第一次尝试将是:
<ui:repeat value="#{panels}" var="panel"> <ui:include src="#{panel.facelet}"> </ui:repeat>
但是因为ui的src所以它不起作用:include太早评估了。 facelet信息是真正动态的,所以我不能使用c:forEach(不是真的建议与facelets混合使用)。我想这一切都归结为找到一个基于组件的ui:include alternative。
是否有这样的事情或我需要自己编写?
答案 0 :(得分:4)
我想我已经找到了你一直在寻找的相对简单的解决方案。
我也开始使用ui:在ui中包含:像你一样重复,但我接受了我必须使用ac:forEach,并且c:forEach非常适合动态获取一组不同的xhtml / components来包含即使用户互动改变视图中的东西,就像我认为你有。它看起来像这样:
<c:forEach var="thing" items="#{view.things}">
<ui:include src="#{thing.renderComponent}">
<ui:param name="thing" value="#{thing}"/>
</ui:include>
</c:forEach>
然而,我的ui:param不起作用 - 我包含的每个组件都被传递了相同的东西&#34; / Object,即使我们已成功使用不同的东西/对象来动态地包含不同的组件。
当我找到this帖子时,我鼓励我包装我的ui:包含在f:子视图中。现在一切都运行良好,使用以下代码:
<c:forEach var="thing" items="#{view.things}" varStatus="loop">
<f:subview id="thing_#{loop.index}">
<ui:include src="#{thing.renderComponent}">
<ui:param name="thing" value="#{thing}"/>
</ui:include>
</f:subview>
</c:forEach>
答案 1 :(得分:2)
c:forEach会解决它,为什么你不能使用它?
有关该问题的有趣文章: http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets
答案 2 :(得分:0)
我记得尝试使用自定义标签和FaceletHandler等做类似的事情。最后,所有小的渲染时间问题都使得它不值得付出努力。请注意我是(仍然是: - ()使用faces for jsf 1.1,所以不确定在以后的版本中这是否更好。
你有多少动态/多少不同的facelets需要处理?我问的原因是你可以(从编译器向导借用一个术语)展开你的循环。而不是
<ui:repeat value="#{panels}" var="panel">
<ui:include src="#{panel.facelet}">
</ui:repeat>
你可以做到
<custom:panelOneFacelet rendered="#{hasPanel1}" />
<custom:panelTwoFacelet rendered="#{hasPanel2}" />
<!-- etc... -->
在你的脸上,你会有类似的东西:
<c:if test="#rendered" >
<!-- EVERYTHING IN THE FACELET HERE!!!-->
</c:if>
这种 低技术 方法适用于小型受控套装,但如果您拥有非常大且不同的小组,这可能无效。< / p>
我可能会问为什么,b / c有时会对高级别人员有所了解,所以大师可能会提出更简单的想法来实现相同的目标