动态ui:包括ui内部:重复。有简单的解决方案吗?

时间:2010-07-29 12:37:00

标签: java jsf facelets

我想动态选择一个facelet来渲染我的数据列表中的一些项目。第一次尝试将是:

<ui:repeat value="#{panels}" var="panel">
  <ui:include src="#{panel.facelet}">
</ui:repeat>

但是因为ui的src所以它不起作用:include太早评估了。 facelet信息是真正动态的,所以我不能使用c:forEach(不是真的建议与facelets混合使用)。我想这一切都归结为找到一个基于组件的ui:include alternative。

是否有这样的事情或我需要自己编写?

3 个答案:

答案 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有时会对高级别人员有所了解,所以大师可能会提出更简单的想法来实现相同的目标