アイテムの数を選択するフォームがあります。[送信] をクリックすると、選択したアイテムが表示される新しいページが表示され、選択したアイテムの数に応じて、アイテムごとに 1 つずつ、多数の jqPlots が作成されます。
これを行うにはどうすればよいですか?
ありがとう、S.
この質問は非常に一般的ですが、複数のチャートをロードするという質問に (具体的にのみ) 答えます。
グラフごとに一意の HTML div ID が必要です。各チャート/div のシーケンシャル インデックスではなく、RFC 4122 UUID (必要に応じて生成) の使用を検討してください。それぞれのプレースホルダー div として次のようなものを使用します。
<div class="chartdiv" id="chartdiv-${UID}">
<a rel="api" type="application/json" href="${JSON_URL}" style="display:none">Data</a>
</div>
これにより、内部の各 div の JSON URL が非表示のハイパーリンクに埋め込まれます。このハイパーリンクは、マルチチャート HTML ページを反復処理する JavaScript によって検出できます。
UUID の問題は重要ではありません。これは、JavaScript で各グラフにアドレス指定できる一意の HTML ID を保証する最も堅牢な方法のように思えます。
その後、次のような JavaScript が必要です。
jq('document').ready(function(){
jq('.chartdiv').each(function(index) {
var div = jq(this);
var json_url = jq('a[type="application/json"]', div).attr('href');
var divid = div.attr('id');
jq.ajax({
url: json_url,
success: function(responseText) { /*callback*/
// TODO: responseText is JSON, use it, normalize it, whatever!
var chartdata = responseText;
jq.jqplot(divid, chartdata.seriesdata, chartdata.options);
}
});
});
});
アイテムの詳細がなければ、詳細を示すことは困難ですが、基本的には、プロットするアイテムを含む JSON 構造をビューに渡します。次に、JSON 構造をループして、プロットする各項目の DIV タグを作成し、DIV タグを本文に追加します。
Javascript 部分は次のようになります。
$.each(items, function(index, value) {
$myPlot = $("<div>");
$myPlot.attr("id", "item"+index);
$.jqplot($myPlot.attr("id"), ...);
$("body").append($myPlot);
});