製品版のみの機能
データ チャート - KnockoutJS でチャート項目の編集
注: Knockout 拡張機能は ASP.NET MVC ヘルパーとは動作しません。
このサンプルは、Knockout ビュー モデルのデータ ソースの変更を処理する igDataChart コントロールを紹介します。 コントロールを再バインドせずにチャートが更新されます。デフォルトで、サンプルは月の最初の 10 日の売上および経費を表示します。 チャートに日を追加/削除するか、項目を移動し、チャートを更新します。
このサンプルは、Knockout ビュー モデルのデータ ソースの変更を処理する igDataChart コントロールを紹介します。 コントロールを再バインドせずにチャートが更新されます。デフォルトで、サンプルは月の最初の 10 日の売上および経費を表示します。 チャートに日を追加/削除するか、項目を移動し、チャートを更新します。
このサンプルは CTP 機能を使用しています。製品版では、API や動作が変更される場合があります。
シミュレーション オプション:
新しい日を追加する
選択した日を削除する
選択した日を左へ移動
選択した日を右へ移動
連続移動シミュレーションを再生する
シミュレーションを一時停止する
このサンプルは、より大きい画面サイズのためにデザインされました。
モバイル デバイスで画面を回転、フル サイズ表示、またはその他のデバイスにメールで送信します。
コード ビュー
クリップボードへコピー
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Knockout JS</title> <!-- Ignite UI for jQuery Required Combined CSS Files --> <link href="http://cdn-na.infragistics.com/igniteui/2024.1/latest/css/themes/infragistics/infragistics.theme.css" rel="stylesheet" /> <link href="http://cdn-na.infragistics.com/igniteui/2024.1/latest/css/structure/infragistics.css" rel="stylesheet" /> <!--CSS file specific for chart styling --> <link href="http://cdn-na.infragistics.com/igniteui/2024.1/latest/css/structure/modules/infragistics.ui.chart.css" rel="stylesheet" /> <script src="http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.8.3.js"></script> <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script> <script src="http://code.jquery.com/ui/1.11.1/jquery-ui.min.js"></script> <!-- Ignite UI for jQuery Required Combined JavaScript Files --> <script src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/infragistics.core.js"></script> <script src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/infragistics.lob.js"></script> <script src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/infragistics.dv.js"></script> </head> <body> <style> .main-container { position: relative; width: 100% } .float { float: left; margin: 10px 10px 0 0; } .clear { clear: both; } .margin-b { margin-bottom: 20px; } .btn-container { margin-top: 30px; position: relative; width: 600px; height: 50px; } .btn-container .btn-pause:hover { background-position: -96px -50px; } #lineChart { margin-right: 20px; margin-top: 20px; } .combo-container { width: 210px; float: right; margin-right: 20px; } .sample-chart-container { margin-right: 240px; } .legend-container { width: 300px; margin-top: 10px; } .legend-container .title { font-weight: bold; font-size: 14px; margin-bottom: 10px; } .legend-container .legend { float: left; width: 48px; height: 48px; margin: 2px 5px 5px 0; padding: 0; background-image: url(/images/samples/data-chart/music-controls-sprite.png); background-repeat: no-repeat; border: 1px solid #535353; zoom: 50%; } .legend-container .add { background-position: -337px 0px; } .legend-container .delete { background-position: -384px 0px; } .legend-container .prev { background-position: -192px 0px; } .legend-container .next { background-position: -240px 0px; } .legend-container .play { background-position: 0px 0px; } .legend-container .btn-add-start { background-position: -337px 0px; } .btn-container .btn-add-start:hover { background-position: -337px -50px; } .legend-container .btn-rmv-start { background-position: -384px 0px; } .btn-container .btn-rmv-start:hover { background-position: -384px -50px; } .legend-container .btn-add-curr { background-position: -337px 0px; } .btn-container .btn-add-curr:hover { background-position: -337px -50px; } .legend-container .btn-rmv-curr { background-position: -384px 0px; } .btn-container .btn-rmv-curr:hover { background-position: -384px -50px; } .legend-container .btn-prev { background-position: -192px 0px; } .btn-container .btn-prev:hover { background-position: -192px -50px; } .legend-container .btn-play { background-position: 0px 0px; } .btn-container .btn-play:hover { background-position: 0px -50px; } .legend-container .btn-next { background-position: -240px 0px; } .btn-container .btn-next:hover { background-position: -240px -50px; } .legend-container .btn-rmv-end { background-position: -384px 0px; } .btn-container .btn-rmv-end:hover { background-position: -384px -50px; } .legend-container .btn-add-end { background-position: -336px 0px; } .btn-container .btn-add-end:hover { background-position: -336px -50px; } .legend-container .btn-pause { background-position: -96px 0px; opacity: 0.5 } .legend-container button { float: left; width: 48px; height: 48px; margin: 2px 5px 5px 0; padding: 0; border: none; cursor: pointer; padding: 0; background-image: url(/images/samples/data-chart/music-controls-sprite.png); background-repeat: no-repeat; border: 1px solid #535353; zoom: 50% } .legend-container span { font-size: 12px; } #barColumnChart { margin-top: 20px; } #legendLineChart { border: none; background-color: transparent; font-weight: bold; } #legendBarColumnChart { border: none; background-color: transparent; font-weight: bold; } .sample-header { margin-top: 10px; height: 80px; line-height: 75px; text-align: center; width: 100%; background-color: #44acd6; } @media screen and (max-width: 600px) { /* Polar chart container and legend under 600px */ .combo-container { width: 100%; float: none; } .sample-chart-container { margin-right: 0; } } @media screen and (max-width: 430px) { #sample > section > * { margin: 0; } } </style> <script src="/js/external/knockout-latest.js" type="text/javascript"></script> <script src="/js/external/knockout.mapping-latest.js" type="text/javascript"></script> <script type="text/javascript" src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/extensions/infragistics.ui.datachart.knockout-extensions.js"></script> <script type="text/javascript" src="http://cdn-na.infragistics.com/igniteui/2024.1/latest/js/extensions/infragistics.ui.combo.knockout-extensions.js"></script> <script type="text/javascript"> $(function () { var dynamicModel, data, interval, globalItem = 3, globalIndex = 3, // When item is deleted we need to record gloablly the index autoIncrement = 1; function generateData(count) { var num = count, data = [], curr = 10, revenue, expenses; for (var i = 0; i < num; i++) { revenue = Math.random() * 90.0; expenses = Math.random() * 70.0; data[i] = { label: (count === 1) ? autoIncrement.toString() : (i + 1).toString(), index: (count === 1) ? autoIncrement : (i + 1), revenue: revenue, expenses: expenses }; autoIncrement++; } if (count === 1) { return data[0]; } else { return ko.observableArray(data); } } function ViewModel(data) { this.data = data; this.minChartValue = 0; this.maxChartValue = 100; this.chartWidth = "100%"; this.chartHeight = 250; this.chartThickness = 2; this.transitionDuration = 1000; } data = generateData(10); dynamicModel = new ViewModel(data); ko.applyBindings(dynamicModel); $(".btn-prev").click(function () { try { var index = $("#combo1").igCombo("value"); moveItem(-1, index); } catch (e) { return; } }); $(".btn-next").click(function () { try { var index = $("#combo1").igCombo("value"); moveItem(1, index); } catch (e) { return; } }); $(".btn-play").click(function () { var index = $("#combo1").igCombo("value"); moveItem(1, index); interval = setInterval(function () { moveItem(1, index) }, 1000); hideButtons(); }); $(".btn-pause").click(function () { clearInterval(interval); showButtons(); }); $(".btn-add-start").click(function () { data.unshift(generateData(1)); }); $(".btn-rmv-start").click(function () { globalIndex = 0; data.shift(); }); $(".btn-add-end").click(function () { data.push(generateData(1)); }); $(".btn-rmv-end").click(function () { globalIndex = data().length; data.pop(); }); $(".btn-add-curr").click(function () { var index = $("#combo1").igCombo("value"); data.splice(getCurrentItemState(index).index, 0, generateData(1)); }); $(".btn-rmv-curr").click(function () { try { var index = $("#combo1").igCombo("value"); if (index !== null) { globalIndex = getCurrentItemState(index).index; data.splice(globalIndex, 1); } } catch (e) { return; } }); function moveItem(step, currentIndex) { var state = getCurrentItemState(currentIndex), itemToMove = state.item, index = state.index, insertIndex; globalItem = currentIndex; globalIndex = index; data.splice(index, 1); if (step > 0) { insertIndex = (index === data().length) ? 0 : index + step; } else { insertIndex = (index === 0) ? data().length : index + step; } data.splice(insertIndex, 0, itemToMove); } function getCurrentItemState(currentIndex) { var i = 0; for (i; i < data().length; i++) { if (data()[i].index === currentIndex) { return { item: data()[i], index: i } } } } $(".combo-container").on("igcombotextchanged", "#combo1", function (event, ui) { globalItem = parseInt(ui.text, 10); }).on("igcomboitemsrendered", "#combo1", function (event, ui) { if (ui.owner.selectedItems() === null || ui.owner.selectedItems().length === 0) { ui.owner.index(globalIndex); if (ui.owner.selectedItems() === null || ui.owner.selectedItems().length === 0) { ui.owner.index(globalIndex - 1); } } }); function hideButtons() { $('.legend-container button:not(.btn-pause)').attr('disabled', 'disabled').animate({opacity: 0.5}); $('.legend-container .btn-pause').removeAttr('disabled').animate({ opacity: 1 }); } function showButtons() { $('.legend-container button:not(.btn-pause)').removeAttr('disabled').animate({ opacity: 1 }); $('.legend-container .btn-pause').attr('disabled', 'disabled').animate({ opacity: 0.5 }); } }); </script> <!-- <div class="sample-header"> <h1>日の経費/売上シミュレーション</h1> </div>--> <div class="main-container"> <div class="combo-container"> <label for="combo1">現在の項目を選択</label> <div class="clear"></div> <div id="combo1" data-bind="igCombo: { dataSource: data, selectedItems: [{ index: 3 }], valueKey: 'index', textKey: 'label', width: '150', mode: 'dropdown', enableClearButton: false }"></div> <div class="legend-container"> <div class="title">シミュレーション オプション:</div> <button class="btn-add-end" title="項目を igDataChart の終了に追加する"></button> <span>新しい日を追加する</span><div class="clear"></div> <button class="btn-rmv-curr" title="最後の項目を igDataChart から削除する"></button> <span>選択した日を削除する</span><div class="clear"></div> <button class="btn-prev" title="現在の項目の選択を左に移動する"></button> <span>選択した日を左へ移動</span><div class="clear"></div> <button class="btn-next" title="現在の項目の選択を右に移動する"></button> <span>選択した日を右へ移動</span><div class="clear"></div> <button class="btn-play" title="現在の項目を秒によって右に移動する"></button> <span>連続移動シミュレーションを再生する</span><div class="clear"></div> <button class="btn-pause" title="シミュレーションを一時停止する" disabled="disabled"></button> <span>シミュレーションを一時停止する</span><div class="clear"></div> </div> </div> <div class="sample-chart-container"> <div id="lineChart" data-bind='igDataChart: { dataSource: data, width: chartWidth, height: chartHeight, title: "経費 vs. 売上 (日単位)", legend: { element: "legendLineChart" }, axes: [{ name: "xAxis", type: "categoryX", label: "label", interval: 1, }, { name: "yAxis", type: "numericY", minimumValue: minChartValue, maximumValue: maxChartValue, }], series: [{ name: "line1", type: "line", isHighlightingEnabled: true, isTransitionInEnabled: true, title: "売上 日ごと (千単位)", thickness: chartThickness, markerType: "circle", xAxis: "xAxis", yAxis: "yAxis", valueMemberPath: "revenue", transitionDuration: transitionDuration }, { name: "line2", type: "line", isHighlightingEnabled: true, isTransitionInEnabled: true, title: "経費 日ごと (千単位)", thickness: chartThickness, markerType: "circle", xAxis: "xAxis", yAxis: "yAxis", valueMemberPath: "expenses", transitionDuration: transitionDuration, brush: "#d3404b", markerBrush: "#d3404b" }] }'></div> <div id="legendLineChart"></div> <div id="barColumnChart" data-bind='igDataChart: { dataSource: data, width: chartWidth, height: chartHeight, title: "経費 vs. 売上 (日単位)", legend: { element: "legendBarColumnChart" }, axes: [{ name: "xAxis", type: "categoryX", label: "label", interval: 1, }, { name: "yAxis", type: "numericY", minimumValue: minChartValue, maximumValue: maxChartValue }], series: [{ name: "column1", type: "column", isHighlightingEnabled: true, isTransitionInEnabled: true, title: "売上 日ごと (千単位)", thickness: chartThickness, xAxis: "xAxis", yAxis: "yAxis", valueMemberPath: "revenue", transitionDuration: transitionDuration }, { name: "column2", type: "column", isHighlightingEnabled: true, isTransitionInEnabled: true, title: "経費 日ごと (千単位)", thickness: chartThickness, xAxis: "xAxis", yAxis: "yAxis", valueMemberPath: "expenses", transitionDuration: transitionDuration, brush: "#d3404b" }] }'></div> <div id="legendBarColumnChart"></div> </div> </div> </body> </html>