@@ -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)
121136var 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 ] ) ) {
0 commit comments