2016-06-20 1 views
0

AngularJSとHighChartsを学習する。 [Plunker Link] [1]JsonオブジェクトからAngularJSでHighChartをレンダリングする

JSONオブジェクトからデータを取得し、x軸と棒グラフの値を動的に更新する方法を理解したいと思います。 Y軸の値は一定です。 今、値をハードコードしました。バックエンドのx軸と棒グラフの値が必要です。ここで

は、私が試したものである -

(function() { 
 
    'use strict'; 
 
    angular.module('myModule', []) 
 
    // Directive for generic chart, pass in chart options 
 
    .directive('hcChart', function() { 
 
     return { 
 
     restrict: 'E', 
 
     template: '<div></div>', 
 
     scope: { 
 
      options: '=' 
 
     }, 
 
     link: function(scope, element) { 
 
      Highcharts.chart(element[0], scope.options); 
 
     } 
 
     }; 
 
    }) 
 

 
    .controller('MainCtrl', function($scope, $http) { 
 

 
    $scope.chartData = []; 
 
    $scope.totalCostList = []; 
 

 
    loadChartData(); 
 

 
    function loadChartData() { 
 
     var httpRequest = $http({ 
 
     method: 'GET', 
 
     url: './example.json' 
 
     }).then(function(response) { 
 
     console.log(response.data); 
 
     $scope.chartData = response.data; 
 
     console.log("length:" + $scope.chartData.activityResponse.length); 
 
     for (var i = 0; i < $scope.chartData.activityResponse.length; i++) { 
 
      $scope.totalCostList.push(parseInt($scope.chartData.activityResponse[i].totalCost)); 
 
     } 
 
     console.log($scope.totalCostList); 
 
     }); 
 
    } 
 

 
    //var chartData = $scope.totalCostList; 
 
    var yAxisLabels = [1, 5000, 10000, 15000, 20000]; 
 
    var chartData = [ 
 
     10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000, 
 
     10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000, 
 
     10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000, 
 
     10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000, 
 
     10000, 5000, 4000, 15000, 16000, 10000, 5000, 4000, 15000, 2000, 
 
     10000, 5000 
 
    ]; 
 
    var dateLine = Date.UTC(2015, 0, 1); 
 
    Highcharts.getOptions().colors[0] = { 
 
     linearGradient: { 
 
     x1: 0, 
 
     y1: 0, 
 
     x2: 0, 
 
     y2: 1 
 
     }, 
 
     stops: [ 
 
     [0, '#6EB7D8'], 
 
     [0.4, '#2989D8'], 
 
     [0.7, '#207cca'], 
 
     [1, '#1E5799'] 
 
     ] 
 
    }; 
 

 
    Highcharts.setOptions({ 
 
     lang: { 
 
     thousandsSep: ',' 
 
     } 
 
    }); 
 
    //To give the chart a bounce effect 
 
    Math.easeOutBounce = function(pos) { 
 
     if ((pos) < (1/2.75)) { 
 
     return (7.5625 * pos * pos); 
 
     } 
 
     if (pos < (2/2.75)) { 
 
     return (7.5625 * (pos -= (1.5/2.75)) * pos + 0.75); 
 
     } 
 
     if (pos < (2.5/2.75)) { 
 
     return (7.5625 * (pos -= (2.25/2.75)) * pos + 0.9375); 
 
     } 
 
     return (7.5625 * (pos -= (2.625/2.75)) * pos + 0.984375); 
 
    }; 
 
    $scope.chartOptions = { 
 
     chart: { 
 
     type: 'column', 
 
     margin: [70, 30, 30, 80] 
 
     }, 
 
     exporting: { 
 
     enabled: false 
 
     }, 
 
     credits: { 
 
     enabled: false 
 
     }, 
 
     legend: { 
 
     enabled: false 
 
     }, 
 
     title: { 
 
     text: 'Weekly Inventory at Cost', 
 
     style: { 
 
      color: '#333' 
 
     }, 
 
     align: 'left', 
 
     x: 10, 
 
     y: 20 
 

 
     }, 
 

 
     xAxis: { 
 
     type: 'datetime', 
 
     dateTimeLabelFormats: { 
 
      month: '%b' 
 
     }, 
 
     lineColor: '#333', 
 
     tickColor: '#333', 
 
     crosshair: true, 
 
     startOnTick: false, 
 
     endOnTick: false, 
 
     minPadding: 0, 
 
     maxPadding: 0, 
 
     tickmarkPlacement: 'on', 
 
     labels: { 
 
      align: 'left', 
 
      rotation: 0 
 
     } 
 
     }, 
 
     yAxis: { 
 
     crosshair: true, 
 
     lineColor: '#333', 
 
     tickColor: '#333', 
 
     tickPositioner: function() { 
 
      return yAxisLabels; 
 
     }, 
 
     labels: { 
 
      format: '{value:,.0f}' 
 
     }, 
 
     title: { 
 
      enabled: false 
 
     }, 
 
     lineWidth: 1, 
 
     tickWidth: 1, 
 
     id: 'cost', 
 
     gridLineWidth: 0, 
 
     min: 1 
 
     }, 
 

 

 
     plotOptions: { 
 
     column: { 
 
      pointPadding: 0.1, 
 
      borderWidth: 0, 
 
      pointPlacement: 'between' 
 
     } 
 
     }, 
 
     shadow: true, 
 

 
     series: [{ 
 
     data: chartData, 
 
     pointStart: dateLine, 
 
     pointInterval: 7 * 24 * 3600 * 1000 // 7days 
 
     }] 
 
    }; 
 
    }); 
 

 
})();
<!DOCTYPE html> 
 
<html ng-app="myModule"> 
 

 
<head> 
 
    <link rel="stylesheet" href="style.css"> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script> 
 
    <script src="https://code.highcharts.com/highcharts.js"></script> 
 
    <script src="script.js"></script> 
 
</head> 
 

 
<body ng-controller="MainCtrl"> 
 
    <hc-chart options="chartOptions" style="width: 96%; height: 300px;">Placeholder for generic chart</hc-chart> 
 
</body> 
 

 
</html>

私の例JSON - { "メッセージ": "成功"、 "状態": "OK"、 「activityResponse ":[{ "storeNo": "00208"、 "週": "1"、 "年": "2016"、 "にtotalCost": "349622.9" }、{ " 秒toreNo ": "00208"、 "週": "2"、 "年": "2016"、 "にtotalCost": "2000" }、 { "storeNo": "00208"、 " 週「: "3"、 "年": "2016"、 "にtotalCost": "15000" }] }

+0

簡単な方法でデータを更新できる[highcharts-ng](https://github.com/pablojim/highcharts-ng)の使用はいかがですか? http://jsfiddle.net/pablojim/7cAq3/ –

+0

@SebastianBochan、私はクリックしてデータを取得したくありません。 RESTエンドポイントによって動的に更新される必要があります。今のところ、この機能を実現するためにmock JSONファイルを使用しています。 –

答えて

1

ここでx軸カテゴリに追加し、カテゴリ値を更新するためのアプローチです。グラフが作成されたときにグラフのシリーズへの参照を取得します。

var series = this.series[0]; 

次に、データの更新がある場合は、次の呼び出しを行います。

series.setData(seriesDataSource, true, true, false); 

私はシリーズのレコードが追加され、更新された状態でチャートの一例を示すために、あなたのPlunkerを適応しています。

+0

ありがとう、@Stringfellow。しかし、これは私が達成しようとしていることではありません。私が探している変更を反映するようにコードを更新しました。 –

関連する問題