UI 重复 varStatus 在 CompositeComponent 中不起作用

2023-12-09

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

我有一个包含图表列表的 bean(jquery HighCharts 的数据)。 对于每个图表,我需要一些 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”。但仍然没有:行:。

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

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

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

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

谢谢巴鲁斯C。

有人有其他想法吗?


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

中的任何 EL 表达式id属性在视图构建期间必须可用。如果你更换<ui:repeat> by <c:forEach>它在视图构建时运行,然后id必须正确设置。另一种选择是去掉那些中的 ELid属性基于<ui:repeat varStatus>。 JSF 将already自动为 ID 添加后缀<ui:repeat>具有行索引的子组件。

请注意,<c:forEach>当与视图作用域 bean 和启用的部分状态保存结合使用时,可能会产生不可预见的副作用。详情请参阅上述链接的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UI 重复 varStatus 在 CompositeComponent 中不起作用 的相关文章

随机推荐