在 Angular-chart.js 上动态设置数据
Dynamically set data on Angular-chart.js
老实说我对angularjs有点陌生,所以这可能是我对angular的基本理解的问题,而不是angular-图表.
我有两个控制器(PieItemsCtrl 和 PieCtrl),我想通过使用工厂服务(称为 pieItems)
一方面,pieItems 按照 PieItemsCtrl 中的设计工作。
即:
$scope.slices = pieItems.list();
只要 pieItems 服务发生变化(即添加另一个元素),HTML 就会通过转发器自动更新:
<div ng-repeat="(key, val) in slices">
但是在 PieCtrl 中我有这一行,我希望饼图自动更新:
$scope.labels = pieItems.labelsItems();
$scope.data = pieItems.data();
似乎是在 PieCtrl 的 loading/initialisation 上设置这些数据值,仅此而已。每当 pieItems 数据更改时,这些范围值都不会更新。
下面是两个controller和factory对象的来源。我还做了一个不可行的 fiddle,以防有帮助
PieItemsCtrl :
app.controller('PieItemsCtrl', function($scope, $http, $rootScope, pieItems) {
$scope.slices = pieItems.list();
$scope.buttonClick = function($event) {
pieItems.add(
{
Name: $scope.newSliceName,
Percent: $scope.newSlicePercent,
Color: $scope.newSliceColor
}
)
}
$scope.deleteClick = function(item, $event) {
pieItems.delete(item);
}
}
)
饼图控件:
app.controller("PieCtrl", function ($scope, $timeout, pieItems) {
$scope.labels = pieItems.labelsItems();
$scope.data = pieItems.data();
});
pieItems :
app.factory('pieItems', function() {
var items = [];
var itemsService = {};
itemsService.add = function(item) {
items.push(item);
};
itemsService.delete = function(item) {
for (i = 0; i < items.length; i++) {
if (items[i].Name === item.Name) {
items.splice(i, 1);
}
}
};
itemsService.list = function() {
return items;
};
itemsService.labelsItems = function() {
var a = ['x', 'y'];
for (i = 0; i < items.length; i++) {
a.push(items[i].Name);
}
return a;
};
itemsService.data = function() {
var a = [50,50];
for (i = 0; i < items.length; i++) {
a.push(items[i].Percent);
}
return a;
};
return itemsService;
});
当您工厂中的值发生变化时,控制器不会注意到。要将您的项目数组包含在 Angular 摘要循环中,请将 Angular 告诉 $watch 该数组。
如果您不想公开数组,请创建一个 getter:
itemsService.get = function() { return items; }
然后您可以在控制器的 $watch 表达式中包含 getter:
$scope.$watch(getItems, watcherFunction, true);
function getItems() {
return pieItems.get();
}
getItems-Function 在摘要循环中被调用,如果值发生变化并以 newData 作为参数,则触发 watcherFunction。 true
因为第三个参数创建了深度监视。
function watcherFunction(newData) {
console.log(newData);
// do sth if array was changed
}
对于更复杂的对象,您可以使用 $watchCollection。
老实说我对angularjs有点陌生,所以这可能是我对angular的基本理解的问题,而不是angular-图表.
我有两个控制器(PieItemsCtrl 和 PieCtrl),我想通过使用工厂服务(称为 pieItems)
一方面,pieItems 按照 PieItemsCtrl 中的设计工作。
即:
$scope.slices = pieItems.list();
只要 pieItems 服务发生变化(即添加另一个元素),HTML 就会通过转发器自动更新:
<div ng-repeat="(key, val) in slices">
但是在 PieCtrl 中我有这一行,我希望饼图自动更新:
$scope.labels = pieItems.labelsItems();
$scope.data = pieItems.data();
似乎是在 PieCtrl 的 loading/initialisation 上设置这些数据值,仅此而已。每当 pieItems 数据更改时,这些范围值都不会更新。
下面是两个controller和factory对象的来源。我还做了一个不可行的 fiddle,以防有帮助
PieItemsCtrl :
app.controller('PieItemsCtrl', function($scope, $http, $rootScope, pieItems) {
$scope.slices = pieItems.list();
$scope.buttonClick = function($event) {
pieItems.add(
{
Name: $scope.newSliceName,
Percent: $scope.newSlicePercent,
Color: $scope.newSliceColor
}
)
}
$scope.deleteClick = function(item, $event) {
pieItems.delete(item);
}
}
)
饼图控件:
app.controller("PieCtrl", function ($scope, $timeout, pieItems) {
$scope.labels = pieItems.labelsItems();
$scope.data = pieItems.data();
});
pieItems :
app.factory('pieItems', function() {
var items = [];
var itemsService = {};
itemsService.add = function(item) {
items.push(item);
};
itemsService.delete = function(item) {
for (i = 0; i < items.length; i++) {
if (items[i].Name === item.Name) {
items.splice(i, 1);
}
}
};
itemsService.list = function() {
return items;
};
itemsService.labelsItems = function() {
var a = ['x', 'y'];
for (i = 0; i < items.length; i++) {
a.push(items[i].Name);
}
return a;
};
itemsService.data = function() {
var a = [50,50];
for (i = 0; i < items.length; i++) {
a.push(items[i].Percent);
}
return a;
};
return itemsService;
});
当您工厂中的值发生变化时,控制器不会注意到。要将您的项目数组包含在 Angular 摘要循环中,请将 Angular 告诉 $watch 该数组。
如果您不想公开数组,请创建一个 getter:
itemsService.get = function() { return items; }
然后您可以在控制器的 $watch 表达式中包含 getter:
$scope.$watch(getItems, watcherFunction, true);
function getItems() {
return pieItems.get();
}
getItems-Function 在摘要循环中被调用,如果值发生变化并以 newData 作为参数,则触发 watcherFunction。 true
因为第三个参数创建了深度监视。
function watcherFunction(newData) {
console.log(newData);
// do sth if array was changed
}
对于更复杂的对象,您可以使用 $watchCollection。