Allow using un() for events registered with once()

This commit is contained in:
Andreas Hocevar
2020-06-11 12:14:32 +02:00
parent 1ef103ed66
commit 852fe2a3fe
2 changed files with 17 additions and 5 deletions

View File

@@ -78,16 +78,18 @@ class Observable extends EventTarget {
* @api * @api
*/ */
once(type, listener) { once(type, listener) {
let key;
if (Array.isArray(type)) { if (Array.isArray(type)) {
const len = type.length; const len = type.length;
const keys = new Array(len); key = new Array(len);
for (let i = 0; i < len; ++i) { for (let i = 0; i < len; ++i) {
keys[i] = listenOnce(this, type[i], listener); key[i] = listenOnce(this, type[i], listener);
} }
return keys;
} else { } 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 * @api
*/ */
un(type, listener) { 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) { for (let i = 0, ii = type.length; i < ii; ++i) {
this.removeEventListener(type[i], listener); this.removeEventListener(type[i], listener);
} }

View File

@@ -97,6 +97,13 @@ describe('ol.Observable', function () {
expect(typeof key).to.be('object'); 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 () { describe('#un()', function () {