【问题标题】:UI Repeat varStatus not working in CompositeComponentUI 重复 varStatus 在 CompositeComponent 中不起作用
【发布时间】:2013-02-13 09:04:06
【问题描述】:

我在 WebSphere Application Server 8 上使用 JSF 2.0 (Apache myFaces)。

我有一个包含图表列表(jquery HighCharts 的数据)的 bean。 对于每个图表,我需要一些 JSF 组件 + 一个写为 CompositeCompoent (look here) 的 Highchart Wrapper

所以我像这样使用 jsf 2 的 ui:repeat 函数:

<?xml version="1.0" encoding="UTF-8" ?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:hc="http://java.sun.com/jsf/composite/chartComponents"
    template="/template/mytemplate.xhtml">

    <ui:define name="content">
        
        
        <ui:repeat value="#{chartCtrl.charts }" var="chart" id="chartrepeat" varStatus="chartStatus">
                #{chartStatus.index }
                <h:form id="chartform_#{chartStatus.index }">

                    <!-- some jsf select stuff-->               
                </h:form>
            
                    #{chartStatus.index }
                    <hc:Chart title="Statistics" id="hcchart_#{chartStatus.index }"
                    <!-- here's the problem-->

                        <ui:repeat value="#{chart.series }" var="serie">
                            <hc:ChartSeries series="#{serie.data }" />
                        </ui:repeat>
                    </hc:Chart>
                    #{chartStatus.index }
            </p:panel>
        </ui:repeat>


        <h:outputScript library="js" name="highcharts.js" />
        <h:outputScript library="js/modules" name="exporting.js" />
        <h:outputScript library="js" name="jquery-1.9.1.min.js" target="head" />

    </ui:define>
</ui:composition>

#{chartStatus.index } 在任何地方都有效,但在 hc:Chart id="" 中无效。 这个 CC 生成的 js 和 div 包含 id 'hcchart_chartdiv'。当前重复左侧的索引。

如何将正确的数字传递给 id 属性?

编辑:复合组件

这里是 hc:Chart 中应该使用 ID 的部分

<cc:implementation>
    <div id="#{cc.id}_chartDiv" />

        <!-- Highcharts -_>
    <script type="text/javascript">
        $(function() {
            // Data must be defined WITHIN the function. This prevents
            // different charts using the same data variables.
            var options = {
                credits : {
                    enabled : false
                },
                chart : {
                    renderTo : '#{cc.id}_chartDiv',
            ....
        </script>

当我将 hc:Chart 中的属性 id 留空时,生成的 ID 类似于“j_id568185923_1_5f9521d0_chartDiv”。但仍然没有:row:。

编辑 2:IndexOf 方法 我测试了另一种设置图表 ID 的方法。

id="hc_#{chartCtrl.charts.indexOf(chart) }"

我尝试使用我的 ArrayList 的 IndexOf 方法。我在所有类中实现了 HashCode 和 Equals 方法。当我测试它时,它工作正常。 但是当我将它与 EL 一起使用时,我会返回 -1。

解决方案 正如 BalusC 所说,我不能将 ID 标签用于 EL。所以我简单地在我的 CC 中创建了一个新属性。这很好用(就是这么简单)。

感谢 BalusC。

有人有其他想法吗?

【问题讨论】:

    标签: jsf-2 el composite-component


    【解决方案1】:

    id 属性在视图构建时进行评估。 &lt;ui:repeat varStatus&gt; 是在视图渲染时间(视图构建时间之后)设置的。本质上,您遇到的问题与此处详细说明的问题相同:JSTL in JSF2 Facelets... makes sense?

    id 属性中的任何 EL 表达式必须在视图构建期间可用。如果将&lt;ui:repeat&gt; 替换为在视图构建期间运行的&lt;c:forEach&gt;,则必须正确设置id。另一种方法是基于&lt;ui:repeat varStatus&gt; 删除那些id 属性中的EL。 JSF 将已经自动为 &lt;ui:repeat&gt; 子组件的 ID 加上行索引。

    请注意,&lt;c:forEach&gt; 与视图范围的 bean 和启用的部分状态保存结合使用时可能会产生无法预料的副作用。有关详细信息,请参阅前面链接的答案。

    【讨论】:

    • 感谢您的回复。当我使用 c:forEach 时,我得到一个 outoufmemory 异常(堆空间)。但我不知道为什么。在我的例子中,图表被渲染到的 div 没有得到 :row: 因为它是一个硬编码的 id。你有别的想法吗?
    • 是否包括递归?您应该使用树组件,例如 &lt;p:tree&gt; 或无标记 &lt;o:tree&gt;。或者只是通过从 id 属性中删除任何 EL 来利用 JSF 的唯一 ID 自动生成。
    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2013-12-10
    • 2017-02-28
    • 2013-10-27
    • 2016-05-25
    • 2017-06-03
    相关资源
    最近更新 更多