UI重复varStatus在CompositeComponent不工作(UI Repeat varS

2019-07-20 15:17发布

我的WebSphere Application Server 8上使用JSF 2.0(Apache的MyFaces的)。

我有一个包含图表(数据jQuery的HighCharts)列表的豆。 对于每一个图表,我需要一些JSF组件+一个Highchart包装写成CompositeCompoent( 看这里 )

所以我使用UI:JSF 2这样的复读功能:

<?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工作的每一个地方,但不是在慧聪网:病历ID =“”。 生成的js和DIV该CC包含ID“hcchart_chartdiv”。 当前重复的索引离开。

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

编辑:复合组件

这里是HC的一部分:其中,要使用的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>

当我离开慧聪属性ID:图空,那么生成的ID是一样的东西“j_id568185923_1_5f9521d0_chartDiv”。 但仍然没有:行:。

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

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

我试图用我的ArrayList IndexOf方法。 我实现了UND的hashCode equals方法中的所有类。 当我测试它,它工作正常。 但是,当我与EL使用它,我得-1返回。

解决方案正如BalusC说我不能使用EL ID标签。 所以我简单的创建了我的CC一个新的属性。 这工作正常(只是那么容易)。

谢谢BalusC。

是否有人有另外一种想法?

Answer 1:

id在视图编译时间属性进行评价。 所述<ui:repeat varStatus>被视图期间设置渲染时间是视图编译时间之后 。 从本质上讲,你同样的问题详细解释在这里: JSTL在JSF2的Facelets ...有道理?

在任何EL表达式id属性必须是在视图编译时间可用。 如果更换<ui:repeat><c:forEach>这在视图生成时运行,则id必须正确设置。 另一种方法是只得到那些摆脱EL的id属性,基于<ui:repeat varStatus> JSF将自动后缀的ID <ui:repeat>与行索引子组件。

注意, <c:forEach>组合使用视图作用域豆和保存启用局部状态时可以具有无法预料的副作用。 详情请参阅aforelinked答案。



文章来源: UI Repeat varStatus not working in CompositeComponent