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さん、ありがとうございます。
誰かが別のアイデアを持っていますか?