this._parsing = false;
this._data = undefined;
this._dataCopy = undefined;
+ this._dataModified = false;
this._objectData = undefined;
this._labels = undefined;
this._scaleStacked = {};
me._data = convertObjectDataToArray(data);
me._objectData = data;
} else {
- if (me._data === data && helpers.arrayEquals(data, me._dataCopy)) {
+ if (me._data === data && !me._dataModified && helpers.arrayEquals(data, me._dataCopy)) {
return false;
}
// Note: This is suboptimal, but better than always parsing the data
me._dataCopy = data.slice(0);
+ me._dataModified = false;
+
if (data && Object.isExtensible(data)) {
listenArrayEvents(data, me);
}
_onDataPush() {
const count = arguments.length;
this._insertElements(this.getDataset().data.length - count, count);
+ this._dataModified = true;
}
/**
*/
_onDataPop() {
this._removeElements(this._cachedMeta.data.length - 1, 1);
+ this._dataModified = true;
}
/**
*/
_onDataShift() {
this._removeElements(0, 1);
+ this._dataModified = true;
}
/**
_onDataSplice(start, count) {
this._removeElements(start, count);
this._insertElements(start, arguments.length - 2);
+ this._dataModified = true;
}
/**
*/
_onDataUnshift() {
this._insertElements(0, arguments.length);
+ this._dataModified = true;
}
}
expect(meta.data.length).toBe(42);
});
+ // https://github.com/chartjs/Chart.js/issues/7243
+ it('should re-synchronize metadata when data is moved and values are equal', function() {
+ var data = [10, 10, 10, 10, 10, 10];
+ var chart = acquireChart({
+ type: 'line',
+ data: {
+ labels: ['a', 'b', 'c', 'd', 'e', 'f'],
+ datasets: [{
+ data,
+ fill: true
+ }]
+ }
+ });
+
+ var meta = chart.getDatasetMeta(0);
+
+ expect(meta.data.length).toBe(6);
+ const firstX = meta.data[0].x;
+
+ data.push(data.shift());
+ chart.update();
+
+ expect(meta.data.length).toBe(6);
+ expect(meta.data[0].x).toEqual(firstX);
+ });
+
it('should re-synchronize metadata when scaleID changes', function() {
var chart = acquireChart({
type: 'line',