如何使用动态数据创建 AngularJS 个图表
how to Create AngularJS charts with dynamic data
嗨,我正在尝试制作一个网页来显示政客推文的观点。我正在尝试为情绪统计创建图表。我正在使用 Zingchart,我可以创建静态数据,但无法创建动态数据。
这是我用来插入带有数组图表数据的静态数据的代码。
<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>
static pie chart
它像这样工作正常,但我想使用我的 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>
如何从angular控制器中获取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>
PoliticianData.stats.total_positive 正确显示计数,我想使用相同的数据作为图表的输入值。
我该怎么做?
- 使用工厂创建服务
- 为数据调用该服务
- 仅使用 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>
坦白说,我是 ZingChart 团队的一员。
您正在寻找的确切功能是数据绑定。我们的 angularjs-charts 页面上有关于图表数据绑定元素的文档。
在您的情况下,需要执行几个步骤才能达到您的要求。我的第一个建议是在 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
因为 code 通过使用 [=15] 对 zc-values
进行了深入的平等观察=].
"The $watchCollection() function is a sort-of mid-ground between the two $watch() configurations above. It's more in-depth than the vanilla $watch() function; but, it's not nearly as expensive as the deep-equality $watch() function. Like the $watch() function, the $watchCollection() works by comparing physical object references; however, unlike the $watch() function, the $watchCollection() goes one-level deep and performs an additional, shallow reference check of the top level items in the collection."-referenced here.
这就是为什么只有当我更改 aValues 数组中的引用时它才会在我的示例中起作用。
您可以看到在$timeout 中有两种方法可以更新图表的值。因为你有一个数组数组,所以对内部数组的更改不会被反映出来,因为它们是深层对象属性。您可以看到更新单个数组必须强制分配回父级以反映更改。直接对父项进行更改将更新引用并将更改反映在一行中。
Codepen 演示 here.
更多Angular/ZingChart个链接
嗨,我正在尝试制作一个网页来显示政客推文的观点。我正在尝试为情绪统计创建图表。我正在使用 Zingchart,我可以创建静态数据,但无法创建动态数据。
这是我用来插入带有数组图表数据的静态数据的代码。
<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>
static pie chart
它像这样工作正常,但我想使用我的 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>
如何从angular控制器中获取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>
PoliticianData.stats.total_positive 正确显示计数,我想使用相同的数据作为图表的输入值。 我该怎么做?
- 使用工厂创建服务
- 为数据调用该服务
- 仅使用 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>
坦白说,我是 ZingChart 团队的一员。
您正在寻找的确切功能是数据绑定。我们的 angularjs-charts 页面上有关于图表数据绑定元素的文档。
在您的情况下,需要执行几个步骤才能达到您的要求。我的第一个建议是在 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
因为 code 通过使用 [=15] 对 zc-values
进行了深入的平等观察=].
"The $watchCollection() function is a sort-of mid-ground between the two $watch() configurations above. It's more in-depth than the vanilla $watch() function; but, it's not nearly as expensive as the deep-equality $watch() function. Like the $watch() function, the $watchCollection() works by comparing physical object references; however, unlike the $watch() function, the $watchCollection() goes one-level deep and performs an additional, shallow reference check of the top level items in the collection."-referenced here.
这就是为什么只有当我更改 aValues 数组中的引用时它才会在我的示例中起作用。
您可以看到在$timeout 中有两种方法可以更新图表的值。因为你有一个数组数组,所以对内部数组的更改不会被反映出来,因为它们是深层对象属性。您可以看到更新单个数组必须强制分配回父级以反映更改。直接对父项进行更改将更新引用并将更改反映在一行中。
Codepen 演示 here.
更多Angular/ZingChart个链接