Skip to content

Commit 4997e7f

Browse files
committed
Add support for data as object
1 parent 2a18b62 commit 4997e7f

File tree

3 files changed

+60
-25
lines changed

3 files changed

+60
-25
lines changed

src/controllers/controller.bar.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ module.exports = DatasetController.extend({
257257
var i, ilen, min;
258258

259259
for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
260-
pixels.push(scale.getPixelForValue(null, i, datasetIndex));
260+
pixels.push(scale._getPixelForIndex(i, datasetIndex));
261261
}
262262

263263
min = helpers.isNullOrUndef(scale.options.barThickness)

src/core/core.datasetController.js

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,21 @@ function loadCustomData(meta, index) {
117117
&& metaData[index]._parsed._custom;
118118
}
119119

120+
function convertObjectDataToArray(data) {
121+
var keys = Object.keys(data);
122+
var adata = [];
123+
var i, ilen, key;
124+
for (i = 0, ilen = keys.length; i < ilen; ++i) {
125+
key = keys[i];
126+
adata.push({
127+
x: key,
128+
y: data[key]
129+
});
130+
}
131+
return adata;
132+
}
133+
134+
120135
// Base class for all dataset controllers (line, bar, etc)
121136
var DatasetController = function(chart, datasetIndex) {
122137
this.initialize(chart, datasetIndex);
@@ -234,12 +249,43 @@ helpers.extend(DatasetController.prototype, {
234249
});
235250
},
236251

252+
_dataCheck: function() {
253+
var me = this;
254+
var dataset = me.getDataset();
255+
var data = dataset.data || (dataset.data = []);
256+
257+
// In order to correctly handle data addition/deletion animation (an thus simulate
258+
// real-time charts), we need to monitor these data modifications and synchronize
259+
// the internal meta data accordingly.
260+
if (me._data !== data) {
261+
if (helpers.isObject(data)) {
262+
// Object data is currently monitored for replacement only
263+
if (me._objectData !== data) {
264+
me._data = convertObjectDataToArray(data);
265+
me._objectData = data;
266+
}
267+
} else {
268+
if (me._data) {
269+
// This case happens when the user replaced the data array instance.
270+
unlistenArrayEvents(me._data, me);
271+
}
272+
273+
if (data && Object.isExtensible(data)) {
274+
listenArrayEvents(data, me);
275+
}
276+
me._data = data;
277+
}
278+
}
279+
},
280+
237281
addElements: function() {
238282
var me = this;
239283
var meta = me.getMeta();
240-
var data = me.getDataset().data || [];
241284
var metaData = meta.data;
242-
var i, ilen;
285+
var i, ilen, data;
286+
287+
me._dataCheck();
288+
data = me._data;
243289

244290
for (i = 0, ilen = data.length; i < ilen; ++i) {
245291
metaData[i] = metaData[i] || me.createMetaData(i);
@@ -256,28 +302,11 @@ helpers.extend(DatasetController.prototype, {
256302
},
257303

258304
buildOrUpdateElements: function() {
259-
var me = this;
260-
var dataset = me.getDataset();
261-
var data = dataset.data || (dataset.data = []);
262-
263-
// In order to correctly handle data addition/deletion animation (an thus simulate
264-
// real-time charts), we need to monitor these data modifications and synchronize
265-
// the internal meta data accordingly.
266-
if (me._data !== data) {
267-
if (me._data) {
268-
// This case happens when the user replaced the data array instance.
269-
unlistenArrayEvents(me._data, me);
270-
}
271-
272-
if (data && Object.isExtensible(data)) {
273-
listenArrayEvents(data, me);
274-
}
275-
me._data = data;
276-
}
305+
this._dataCheck();
277306

278307
// Re-sync meta data in case the user replaced the data array or if we missed
279308
// any updates and so make sure that we handle number of datapoints changing.
280-
me.resyncElements();
309+
this.resyncElements();
281310
},
282311

283312
update: helpers.noop,
@@ -341,9 +370,8 @@ helpers.extend(DatasetController.prototype, {
341370
resyncElements: function() {
342371
var me = this;
343372
var meta = me.getMeta();
344-
var data = me.getDataset().data;
373+
var numData = me._data.length;
345374
var numMeta = meta.data.length;
346-
var numData = data.length;
347375

348376
if (numData < numMeta) {
349377
meta.data.splice(numData, numMeta - numData);
@@ -371,7 +399,7 @@ helpers.extend(DatasetController.prototype, {
371399
_parse: function(start, count) {
372400
var me = this;
373401
var meta = me.getMeta();
374-
var data = me.getDataset().data;
402+
var data = me._data;
375403

376404
if (data && data.length) {
377405
if (helpers.isArray(data[0])) {

src/core/core.scale.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,13 @@ module.exports = Element.extend({
584584
*/
585585
_getPixel: helpers.noop,
586586

587+
/**
588+
* @private
589+
*/
590+
_getPixelForIndex: function(index, datasetIndex) {
591+
return this._getPixel(this._getParsedValue(index, datasetIndex));
592+
},
593+
587594
/**
588595
* Used to get the value to display in the tooltip for the data at the given index
589596
* @param index

0 commit comments

Comments
 (0)