this.chartArea = undefined;
this._active = [];
this._lastEvent = undefined;
- /** @type {{attach?: function, detach?: function, resize?: function}} */
this._listeners = {};
+ /** @type {?{attach?: function, detach?: function, resize?: function}} */
+ this._responsiveListeners = undefined;
this._sortedMetasets = [];
this.scales = {};
this.scale = undefined;
const existingEvents = new Set(Object.keys(me._listeners));
const newEvents = new Set(me.options.events);
- if (!setsEqual(existingEvents, newEvents)) {
- // The events array has changed. Rebind it
+ if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== me.options.responsive) {
+ // The configured events have changed. Rebind.
me.unbindEvents();
me.bindEvents();
}
* @private
*/
bindEvents() {
+ this.bindUserEvents();
+ if (this.options.responsive) {
+ this.bindResponsiveEvents();
+ } else {
+ this.attached = true;
+ }
+ }
+
+ /**
+ * @private
+ */
+ bindUserEvents() {
const me = this;
const listeners = me._listeners;
const platform = me.platform;
platform.addEventListener(me, type, listener);
listeners[type] = listener;
};
- const _remove = (type, listener) => {
- if (listeners[type]) {
- platform.removeEventListener(me, type, listener);
- delete listeners[type];
- }
- };
- let listener = function(e, x, y) {
+ const listener = function(e, x, y) {
e.offsetX = x;
e.offsetY = y;
me._eventHandler(e);
};
each(me.options.events, (type) => _add(type, listener));
+ }
- if (me.options.responsive) {
- listener = (width, height) => {
- if (me.canvas) {
- me.resize(width, height);
- }
- };
+ /**
+ * @private
+ */
+ bindResponsiveEvents() {
+ const me = this;
+ if (!me._responsiveListeners) {
+ me._responsiveListeners = {};
+ }
+ const listeners = me._responsiveListeners;
+ const platform = me.platform;
- let detached; // eslint-disable-line prefer-const
- const attached = () => {
- _remove('attach', attached);
+ const _add = (type, listener) => {
+ platform.addEventListener(me, type, listener);
+ listeners[type] = listener;
+ };
+ const _remove = (type, listener) => {
+ if (listeners[type]) {
+ platform.removeEventListener(me, type, listener);
+ delete listeners[type];
+ }
+ };
- me.attached = true;
- me.resize();
+ const listener = (width, height) => {
+ if (me.canvas) {
+ me.resize(width, height);
+ }
+ };
- _add('resize', listener);
- _add('detach', detached);
- };
+ let detached; // eslint-disable-line prefer-const
+ const attached = () => {
+ _remove('attach', attached);
- detached = () => {
- me.attached = false;
+ me.attached = true;
+ me.resize();
- _remove('resize', listener);
- _add('attach', attached);
- };
+ _add('resize', listener);
+ _add('detach', detached);
+ };
- if (platform.isAttached(me.canvas)) {
- attached();
- } else {
- detached();
- }
+ detached = () => {
+ me.attached = false;
+
+ _remove('resize', listener);
+ _add('attach', attached);
+ };
+
+ if (platform.isAttached(me.canvas)) {
+ attached();
} else {
- me.attached = true;
+ detached();
}
}
*/
unbindEvents() {
const me = this;
- const listeners = me._listeners;
- if (!listeners) {
- return;
- }
+ each(me._listeners, (listener, type) => {
+ me.platform.removeEventListener(me, type, listener);
+ });
me._listeners = {};
- each(listeners, (listener, type) => {
+
+ each(me._responsiveListeners, (listener, type) => {
me.platform.removeEventListener(me, type, listener);
});
+ me._responsiveListeners = undefined;
}
updateHoverStyle(items, mode, enabled) {