Merge pull request #13358 from MoonE/dispatch-events
Avoid event creation when there are no listeners
This commit is contained in:
+6
-2
@@ -172,9 +172,13 @@ class BaseObject extends Observable {
|
|||||||
notify(key, oldValue) {
|
notify(key, oldValue) {
|
||||||
let eventType;
|
let eventType;
|
||||||
eventType = `change:${key}`;
|
eventType = `change:${key}`;
|
||||||
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
|
if (this.hasListener(eventType)) {
|
||||||
|
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
|
||||||
|
}
|
||||||
eventType = ObjectEventType.PROPERTYCHANGE;
|
eventType = ObjectEventType.PROPERTYCHANGE;
|
||||||
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
|
if (this.hasListener(eventType)) {
|
||||||
|
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+40
-39
@@ -83,49 +83,50 @@ class Target extends Disposable {
|
|||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
dispatchEvent(event) {
|
dispatchEvent(event) {
|
||||||
/** @type {import("./Event.js").default|Event} */
|
const isString = typeof event === 'string';
|
||||||
const evt = typeof event === 'string' ? new Event(event) : event;
|
const type = isString ? event : event.type;
|
||||||
const type = evt.type;
|
const listeners = this.listeners_ && this.listeners_[type];
|
||||||
|
if (!listeners) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const evt = isString ? new Event(event) : /** @type {Event} */ (event);
|
||||||
if (!evt.target) {
|
if (!evt.target) {
|
||||||
evt.target = this.eventTarget_ || this;
|
evt.target = this.eventTarget_ || this;
|
||||||
}
|
}
|
||||||
const listeners = this.listeners_ && this.listeners_[type];
|
const dispatching = this.dispatching_ || (this.dispatching_ = {});
|
||||||
let propagate;
|
const pendingRemovals =
|
||||||
if (listeners) {
|
this.pendingRemovals_ || (this.pendingRemovals_ = {});
|
||||||
const dispatching = this.dispatching_ || (this.dispatching_ = {});
|
if (!(type in dispatching)) {
|
||||||
const pendingRemovals =
|
dispatching[type] = 0;
|
||||||
this.pendingRemovals_ || (this.pendingRemovals_ = {});
|
pendingRemovals[type] = 0;
|
||||||
if (!(type in dispatching)) {
|
|
||||||
dispatching[type] = 0;
|
|
||||||
pendingRemovals[type] = 0;
|
|
||||||
}
|
|
||||||
++dispatching[type];
|
|
||||||
for (let i = 0, ii = listeners.length; i < ii; ++i) {
|
|
||||||
if ('handleEvent' in listeners[i]) {
|
|
||||||
propagate = /** @type {import("../events.js").ListenerObject} */ (
|
|
||||||
listeners[i]
|
|
||||||
).handleEvent(evt);
|
|
||||||
} else {
|
|
||||||
propagate = /** @type {import("../events.js").ListenerFunction} */ (
|
|
||||||
listeners[i]
|
|
||||||
).call(this, evt);
|
|
||||||
}
|
|
||||||
if (propagate === false || evt.propagationStopped) {
|
|
||||||
propagate = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
--dispatching[type];
|
|
||||||
if (dispatching[type] === 0) {
|
|
||||||
let pr = pendingRemovals[type];
|
|
||||||
delete pendingRemovals[type];
|
|
||||||
while (pr--) {
|
|
||||||
this.removeEventListener(type, VOID);
|
|
||||||
}
|
|
||||||
delete dispatching[type];
|
|
||||||
}
|
|
||||||
return propagate;
|
|
||||||
}
|
}
|
||||||
|
++dispatching[type];
|
||||||
|
let propagate;
|
||||||
|
for (let i = 0, ii = listeners.length; i < ii; ++i) {
|
||||||
|
if ('handleEvent' in listeners[i]) {
|
||||||
|
propagate = /** @type {import("../events.js").ListenerObject} */ (
|
||||||
|
listeners[i]
|
||||||
|
).handleEvent(evt);
|
||||||
|
} else {
|
||||||
|
propagate = /** @type {import("../events.js").ListenerFunction} */ (
|
||||||
|
listeners[i]
|
||||||
|
).call(this, evt);
|
||||||
|
}
|
||||||
|
if (propagate === false || evt.propagationStopped) {
|
||||||
|
propagate = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (--dispatching[type] === 0) {
|
||||||
|
let pr = pendingRemovals[type];
|
||||||
|
delete pendingRemovals[type];
|
||||||
|
while (pr--) {
|
||||||
|
this.removeEventListener(type, VOID);
|
||||||
|
}
|
||||||
|
delete dispatching[type];
|
||||||
|
}
|
||||||
|
return propagate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+8
-10
@@ -240,27 +240,25 @@ class ImageSource extends Source {
|
|||||||
*/
|
*/
|
||||||
handleImageChange(event) {
|
handleImageChange(event) {
|
||||||
const image = /** @type {import("../Image.js").default} */ (event.target);
|
const image = /** @type {import("../Image.js").default} */ (event.target);
|
||||||
|
let type;
|
||||||
switch (image.getState()) {
|
switch (image.getState()) {
|
||||||
case ImageState.LOADING:
|
case ImageState.LOADING:
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
this.dispatchEvent(
|
type = ImageSourceEventType.IMAGELOADSTART;
|
||||||
new ImageSourceEvent(ImageSourceEventType.IMAGELOADSTART, image)
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case ImageState.LOADED:
|
case ImageState.LOADED:
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
this.dispatchEvent(
|
type = ImageSourceEventType.IMAGELOADEND;
|
||||||
new ImageSourceEvent(ImageSourceEventType.IMAGELOADEND, image)
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case ImageState.ERROR:
|
case ImageState.ERROR:
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
this.dispatchEvent(
|
type = ImageSourceEventType.IMAGELOADERROR;
|
||||||
new ImageSourceEvent(ImageSourceEventType.IMAGELOADERROR, image)
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// pass
|
return;
|
||||||
|
}
|
||||||
|
if (this.hasListener(type)) {
|
||||||
|
this.dispatchEvent(new ImageSourceEvent(type, image));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -457,10 +457,12 @@ class VectorSource extends Source {
|
|||||||
this.featuresRtree_.load(extents, geometryFeatures);
|
this.featuresRtree_.load(extents, geometryFeatures);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0, length = newFeatures.length; i < length; i++) {
|
if (this.hasListener(VectorEventType.ADDFEATURE)) {
|
||||||
this.dispatchEvent(
|
for (let i = 0, length = newFeatures.length; i < length; i++) {
|
||||||
new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i])
|
this.dispatchEvent(
|
||||||
);
|
new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i])
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user