me.index = datasetIndex;
me._cachedMeta = meta = me.getMeta();
me._type = meta.type;
+ me._configure();
me.linkScales();
meta._stacked = isStacked(meta.vScale, meta);
me.addElements();
}
}
});
+ me._parsing = resolve([me._config.parsing, me.chart.options.parsing, true]);
},
/**
const me = this;
const {_cachedMeta: meta, _data: data} = me;
const {iScale, vScale, _stacked} = meta;
- const parsing = resolve([me.getDataset().parsing, me.chart.options.parsing, true]);
let offset = 0;
let i, parsed;
- if (parsing === false) {
+ if (me._parsing === false) {
meta._parsed = data;
} else {
if (helpers.isArray(data[start])) {
const dataset = meta.dataset;
let style;
- me._configure();
if (dataset && index === undefined) {
style = me._resolveDatasetElementOptions();
} else {
insertElements: function(start, count) {
const me = this;
const elements = new Array(count);
- const data = me._cachedMeta.data;
+ const meta = me._cachedMeta;
+ const data = meta.data;
let i;
for (i = 0; i < count; ++i) {
}
data.splice(start, 0, ...elements);
+ if (me._parsing) {
+ meta._parsed.splice(start, 0, ...new Array(count));
+ }
me._parse(start, count);
+
me.updateElements(data, start, count);
},
+ /**
+ * @private
+ */
+ removeElements: function(start, count) {
+ const me = this;
+ if (me._parsing) {
+ me._cachedMeta._parsed.splice(start, count);
+ }
+ me._cachedMeta.data.splice(start, count);
+ },
+
+
/**
* @private
*/
* @private
*/
onDataPop: function() {
- this._cachedMeta.data.pop();
+ this.removeElements(this._cachedMeta.data.length - 1, 1);
},
/**
* @private
*/
onDataShift: function() {
- this._cachedMeta.data.shift();
+ this.removeElements(0, 1);
},
/**
* @private
*/
onDataSplice: function(start, count) {
- this._cachedMeta.data.splice(start, count);
+ this.removeElements(start, count);
this.insertElements(start, arguments.length - 2);
},
});
});
- it('should synchronize metadata when data are inserted or removed', function() {
- var data = [0, 1, 2, 3, 4, 5];
- var chart = acquireChart({
+ it('should synchronize metadata when data are inserted or removed and parsing is on', function() {
+ const data = [0, 1, 2, 3, 4, 5];
+ const chart = acquireChart({
type: 'line',
data: {
datasets: [{
}
});
- var meta = chart.getDatasetMeta(0);
- var first, second, last;
+ const meta = chart.getDatasetMeta(0);
+ const parsedYValues = () => meta._parsed.map(p => p.y);
+ let first, second, last;
first = meta.data[0];
last = meta.data[5];
expect(meta.data.length).toBe(10);
expect(meta.data[0]).toBe(first);
expect(meta.data[5]).toBe(last);
+ expect(parsedYValues()).toEqual(data);
last = meta.data[9];
data.pop();
expect(meta.data.length).toBe(9);
expect(meta.data[0]).toBe(first);
expect(meta.data.indexOf(last)).toBe(-1);
+ expect(parsedYValues()).toEqual(data);
last = meta.data[8];
data.shift();
expect(meta.data.length).toBe(6);
expect(meta.data.indexOf(first)).toBe(-1);
expect(meta.data[5]).toBe(last);
+ expect(parsedYValues()).toEqual(data);
first = meta.data[0];
second = meta.data[1];
expect(meta.data[0]).toBe(first);
expect(meta.data[3]).toBe(last);
expect(meta.data.indexOf(second)).toBe(-1);
+ expect(parsedYValues()).toEqual(data);
data.unshift(12, 13, 14, 15);
data.unshift(16, 17);
expect(meta.data.length).toBe(10);
expect(meta.data[6]).toBe(first);
expect(meta.data[9]).toBe(last);
+ expect(parsedYValues()).toEqual(data);
});
it('should synchronize metadata when data are inserted or removed and parsing is off', function() {