2

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

我有一个包含图表列表(jquery HighCharts 的数据)的 bean。对于每个图表,我需要一些 JSF 组件 + 一个写成 CompositeCompoent 的 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 Approach 我测试了另一种设置图表 ID 的方法。

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

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

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

谢谢BalusC。

有人有其他想法吗?

4

1 回答 1

5

id属性在视图构建期间进行评估。这<ui:repeat varStatus>视图构建时间之后的视图渲染时间期间设置的。本质上,您遇到的问题与此处详细解释的问题相同:JSF2 Facelets 中的 JSTL ... 有意义吗?

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

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

于 2013-02-27T14:15:22.000 回答