From 852fe2a3fe411d88abd91def89315bc8b0eb6401 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 11 Jun 2020 12:14:32 +0200 Subject: [PATCH] Allow using un() for events registered with once() --- src/ol/Observable.js | 15 ++++++++++----- test/spec/ol/observable.test.js | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ol/Observable.js b/src/ol/Observable.js index 49c82e257e..5962fd5dc7 100644 --- a/src/ol/Observable.js +++ b/src/ol/Observable.js @@ -78,16 +78,18 @@ class Observable extends EventTarget { * @api */ once(type, listener) { + let key; if (Array.isArray(type)) { const len = type.length; - const keys = new Array(len); + key = new Array(len); for (let i = 0; i < len; ++i) { - keys[i] = listenOnce(this, type[i], listener); + key[i] = listenOnce(this, type[i], listener); } - return keys; } else { - return listenOnce(this, /** @type {string} */ (type), listener); + key = listenOnce(this, /** @type {string} */ (type), listener); } + /** @type {Object} */ (listener).ol_key = key; + return key; } /** @@ -97,7 +99,10 @@ class Observable extends EventTarget { * @api */ un(type, listener) { - if (Array.isArray(type)) { + const key = /** @type {Object} */ (listener).ol_key; + if (key) { + unByKey(key); + } else if (Array.isArray(type)) { for (let i = 0, ii = type.length; i < ii; ++i) { this.removeEventListener(type[i], listener); } diff --git a/test/spec/ol/observable.test.js b/test/spec/ol/observable.test.js index 4122a0fd1a..d92bdf46a9 100644 --- a/test/spec/ol/observable.test.js +++ b/test/spec/ol/observable.test.js @@ -97,6 +97,13 @@ describe('ol.Observable', function () { expect(typeof key).to.be('object'); }); + + it('can be unregistered with un()', function () { + observable.once('foo', listener); + observable.un('foo', listener); + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(0); + }); }); describe('#un()', function () {