2

WebSphere Application Server 8 で JSF 2.0 (Apache myFaces) を使用しています。

チャートのリスト(jquery HighChartsのデータ)を含むBeanがあります。グラフごとに、いくつかの JSF コンポーネント + CompositeCompoent として記述された 1 つの 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 属性に渡すにはどうすればよいですか?

編集:複合コンポーネント

ID を使用する hc:Chart の一部を次に示します。

<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 und Equals メソッドを実装しました。テストすると、うまくいきます。しかし、EL で使用すると、-1 が返されます。

ソリューション BalusC が言ったように、EL に ID タグを使用することはできません。そのため、CC に新しい属性を簡単に作成しました。それはうまくいきます(とても簡単です)。

BalusCさん、ありがとうございます。

誰かが別のアイデアを持っていますか?

4

1 に答える 1

5

属性は、idビューのビルド時に評価されます。は、ビューのビルド時間<ui:repeat varStatus>のビューのレンダリング時に設定されます。基本的に、ここで詳細に説明されているのと同じ問題があります: JSF2 Facelets の JSTL... 理にかなっていますか?

属性内の EL 式は、idビューのビルド時に使用できる必要があります。ビューのビルド時に実行<ui:repeat>するものを置き換える場合は、適切に設定する必要があります。別の方法は、に基づいてこれらの属性で EL を取り除くことです。JSF は、子コンポーネントの ID の末尾に行インデックスを自動的に追加します。<c:forEach>idid<ui:repeat varStatus><ui:repeat>

<c:forEach>ビュー スコープ Bean と組み合わせて使用​​し、部分的な状態保存を有効にすると、予期しない副作用が発生する可能性があることに注意してください。詳細については、前述の回答を参照してください。

于 2013-02-27T14:15:22.000 に答える