The following private APIs were removed.
+* `Chart._bufferedRender`
+* `Chart._updating`
* `Chart.data.datasets[datasetIndex]._meta`
* `DatasetController._getIndexScaleId`
* `DatasetController._getIndexScale`
##### Core Controller
* The first parameter to `updateHoverStyle` is now an array of objects containing the `element`, `datasetIndex`, and `index`
+* The signature or `resize` changed, the first `silent` parameter was removed.
##### Dataset Controllers
* `afterDatasetsUpdate`, `afterUpdate`, `beforeDatasetsUpdate`, and `beforeUpdate` now receive `args` object as second argument. `options` argument is always the last and thus was moved from 2nd to 3rd place.
* `afterEvent` and `beforeEvent` now receive a wrapped `event` as the second argument. The native event is available via `event.native`.
+* Initial `resize` is no longer silent. Meaning that `resize` event can fire between `beforeInit` and `afterInit`
this.height = height;
this.aspectRatio = height ? width / height : null;
this.options = config.options;
- this._bufferedRender = false;
this._layers = [];
this._metasets = [];
this.boxes = [];
/** @type {{attach?: function, detach?: function, resize?: function}} */
this._listeners = {};
this._sortedMetasets = [];
- this._updating = false;
this.scales = {};
this.scale = undefined;
this._plugins = new PluginService();
me._plugins.notify(me, 'beforeInit');
if (me.options.responsive) {
- // Initial resize before chart draws (must be silent to preserve initial animations).
- me.resize(true);
+ me.resize();
} else {
retinaScale(me, me.options.devicePixelRatio);
}
return this;
}
- resize(silent, width, height) {
+ resize(width, height) {
+ if (!animator.running(this)) {
+ this._resize(width, height);
+ } else {
+ this._resizeBeforeDraw = {width, height};
+ }
+ }
+
+ _resize(width, height) {
const me = this;
const options = me.options;
const canvas = me.canvas;
retinaScale(me, newRatio);
- if (!silent) {
- me._plugins.notify(me, 'resize', [newSize]);
+ me._plugins.notify(me, 'resize', [newSize]);
- callCallback(options.onResize, [newSize], me);
+ callCallback(options.onResize, [newSize], me);
- if (me.attached) {
- me.update('resize');
- }
+ if (me.attached) {
+ me.update('resize');
}
}
const args = {mode};
let i, ilen;
- me._updating = true;
-
each(me.scales, (scale) => {
layouts.removeBox(me, scale);
});
}
me.render();
-
- me._updating = false;
}
/**
draw() {
const me = this;
let i;
-
+ if (me._resizeBeforeDraw) {
+ const {width, height} = me._resizeBeforeDraw;
+ me._resize(width, height);
+ me._resizeBeforeDraw = null;
+ }
me.clear();
if (me.width <= 0 || me.height <= 0) {
if (me.options.responsive) {
listener = (width, height) => {
if (me.canvas) {
- me.resize(false, width, height);
+ me.resize(width, height);
}
};