如何使用动态数据创建AngularJS图表



嗨,我正在尝试创建一个显示政客推特情感的网页。我正试图创建一个情绪统计图表。我正在使用Zingchart,我可以为静态数据创建,但不能为动态数据创建。

这是我用来插入数组chartdata的静态数据的代码。

   <div class="row">
    <div class="col-sm-12">
      <div ng-init="chartdata = [[1167],[456],[990]]">
        <zingchart id="chart-1" zc-values="chartdata" zc-json="myJson" 
         zc-width="100%" zc-height="568px"></zingchart>
      </div>
    </div>
  </div>

静态饼图

它像这样工作很好,但我想使用angularjs中的数据,而不是静态值。例如:我想做这样的事情,但不起作用

  <div class="row">
      <div class="col-sm-12">
        <div ng-init="chartdata =[[{{politicianData.stats.total_positive}}],[{{politicianData.stats.total_negative}}],[{{politicianData.stats.total_neutral}}]]">
          <zingchart id="chart-1" zc-values="chartdata" zc-json="myJson" zc-width="100%" zc-height="568px"></zingchart>
        </div>
      </div>
    </div>

如何从promise数组中获取数据从角度控制器中获取数据?

这是我的政治家控制者:

    angular.module('myapp')
    .controller('PoliticianController', function($scope, PoliticianData, Politician, searchService, utilService) {
var politicianData = new Politician(PoliticianData);
        politicianData.$promise.then(function (result) {
            $scope.politicianData = result;
  });
$scope.myJson = {
                            globals: {
                            shadow: false,
                            fontFamily: "Verdana",
                            fontWeight: "100"
                                        },
                                        type: "pie",
                                        backgroundColor: "#fff",
                                        legend: {
                                            layout: "x5",
                                            position: "50%",
                                            borderColor: "transparent",
                                            marker: {
                                                borderRadius: 10,
                                                borderColor: "transparent"
                                            }
                                        },
                                        tooltip: {
                                            text: "%v requests"
                                        },
                                        plot: {
                                            refAngle: "-90",
                                            borderWidth: "0px",
                                            valueBox: {
                                                placement: "in",
                                                text: "%npv %",
                                                fontSize: "15px",
                                                textAlpha: 1,
                                            }
                                        },
                                        series: [{
                                            text: "Positive",
                                            backgroundColor: "#FA6E6E",
                                        }, {
                                            text: "Negative",
                                            backgroundColor: "#D2D6DE"
                                        }, {
                                            text: "Neutral",
                                            backgroundColor: "#28C2D1"
                                        }]
                                    };
    });

这是politician.html页面

<span>{{politician.first_name}} {{politician.last_name}}</span>
                    </td>
                    <td>{{politicianData.stats.total}}</td>
                    <td>{{politicianData.stats.twitter.total}}</td>
                    <td>{{politicianData.stats.rss.total}}</td>
                   <td>{{politicianData.stats.total_negative}}</td>
                   <td>{{politicianData.stats.total_positive}}</td>
                   <td>{{politicianData.stats.total_neutral}}</td>

PoliticiaData.stats.total_ppositive正确显示计数,我希望使用与图表输入值相同的数据。我该怎么做?

完全公开,我是ZingChart团队的一员。

您正在寻找的功能正是数据绑定。我们在angularjs图表页面上有文档,用于将数据元素绑定到图表。

在你的情况下,有几个步骤需要实现你想要的。我的第一个建议是在ng-init中将不必要的控制器逻辑从视图中删除,并将其保留在指令中。只是一个建议,没有必要。为了这个答案,我的格式将把大部分内容都保存在控制器中。

HTML:

<body ng-app="myApp">
  <div ng-controller="MainController">
    <div zingchart id="chart-1" zc-json="myJson" zc-width="100%" zc-height="568px" zc-values="aValues"></div>
  </div>
</body>

应用程序逻辑:

var app = angular.module('myApp',['zingchart-angularjs']);
app.controller('MainController', function($scope, $timeout) {
// mimick your promise
(function(){
  $scope.data = {};
  $scope.data.valuesOne = [1,2,3,4,5];
  $scope.data.valuesTwo = [1,2,3,4,5];
  $scope.aValues = [$scope.data.valuesOne,$scope.data.valuesTwo];
})();
$scope.myJson = {
  type : "bar",
  title:{
    backgroundColor : "transparent",
    fontColor :"black",
    text : "Hello world"
  },
  backgroundColor : "white",
  series : [
    {
      backgroundColor : '#00baf2'
    },
    {
      backgroundColor : '#4caf4f'
    }
  ]
};
 // automatically wraps code in $apply
 $timeout(function(){
   // wont reflect changes in aValues because its an object
   $scope.data.valuesOne = [5]; 
   // must force the reflection of the changes
   $scope.aValues = [$scope.data.valuesOne, $scope.data.valuesTwo];
   // will reflect changes with one line, not the above two lines
   //$scope.aValues[0] = [5];
 },1500);
});

您可以看到,我设置了$timeout来反映1.5秒后的图形更改。这个$timeout是为了模拟数据库更新中的某种对象更改。有两种方法可以更新值,但要了解为什么我们必须首先了解更多关于ZingChart Angular指令的信息。

您必须在HTML中使用zc-values,而不仅仅是zc-json,因为代码通过使用$watchCollection()zc-values进行了深度相等监视。

"$watchCollection()函数是上面两个$watch()配置之间的中间点。它比普通的$watch)函数更深入;但是,它远没有深度相等的$watch[()函数那么昂贵。与$watch[()]函数一样,$watchCollection[()通过比较物理对象引用来工作;然而,与$watch]()函数不同的是,$watch Collection[()深入一个级别,并对集合中的顶级项执行附加的浅引用检查。"-此处引用。

这就是为什么当我更改aValues数组中的引用时,它只在我的示例中起作用。

您可以看到,在$timeout中,有两种方法可以更新图表的值。因为您有一个数组数组,所以对内部数组的更改不会被反映出来,因为它们是深层对象属性。您可以看到,更新单个数组必须强制分配回父数组才能反映更改。直接对父对象进行更改将更新引用,并在一行中反映更改。

Codepen演示在这里。

更多角度/ZingChart链接

  1. 有角度的页面
  2. ZingChart代码笔
  • 使用工厂创建服务
  • 调用该服务获取数据
  • 仅使用zingchart指令
  • 当范围数据更改时,图表将打开

示例:

var myModule = angular.module('myModule', []);
myModule.controller('myController', function($scope, chartService) {
  $scope.chartdata = chartService.getDataWithService();
});
myModule.factory('chartService', function($http) {
  return {
    getDataWithService: function() {
      var url = "yourServiceURL";
      return $http.get(url);
    },
    getData: function() {
      return {
        type: 'line',
        series: [{
          values: [54, 23, 34, 23, 43]
        }, {
          values: [10, 15, 16, 20, 40]
        }]
      };
    }
  };
});

html:

 <zingchart id="chart-1" zc-values="chartdata" zc-json="myJson" zc-width="100%" zc-height="568px"></zingchart>

相关内容

  • 没有找到相关文章

最新更新