Only bind listeners when necessary

This commit is contained in:
ahocevar
2019-08-29 22:35:32 +02:00
parent aca4a39863
commit fe83d1b32c
2 changed files with 25 additions and 20 deletions
+13 -8
View File
@@ -32,14 +32,19 @@ import {clear} from './obj.js';
* @return {ListenerFunction} Bound listener. * @return {ListenerFunction} Bound listener.
*/ */
export function bindListener(listenerObj) { export function bindListener(listenerObj) {
const boundListener = function(evt) { let boundListener;
const listener = listenerObj.listener; if (listenerObj.bindTo || listenerObj.callOnce) {
const bindTo = listenerObj.bindTo || listenerObj.target; boundListener = function(evt) {
if (listenerObj.callOnce) { const listener = listenerObj.listener;
unlistenByKey(listenerObj); const bindTo = listenerObj.bindTo || listenerObj.target;
} if (listenerObj.callOnce) {
return listener.call(bindTo, evt); unlistenByKey(listenerObj);
}; }
return listener.call(bindTo, evt);
};
} else {
boundListener = listenerObj.listener;
}
listenerObj.boundListener = boundListener; listenerObj.boundListener = boundListener;
return boundListener; return boundListener;
} }
+12 -12
View File
@@ -24,15 +24,14 @@ describe('ol.events', function() {
boundListener(); boundListener();
expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.bindTo); expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.bindTo);
}); });
it('binds to the target when bindTo is not provided', function() { it('binds to the target when bindTo is not provided', function(done) {
const listenerObj = { const target = new EventTarget();
listener: sinon.spy(), const listenerObj = listen(target, 'foo', function() {
target: {id: 1} expect(this).to.equal(target);
}; done();
const boundListener = bindListener(listenerObj); });
expect(listenerObj.boundListener).to.equal(boundListener); expect(listenerObj.boundListener).to.equal(listenerObj.listener);
boundListener(); target.dispatchEvent('foo');
expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.target);
}); });
it('binds a self-unregistering listener when callOnce is true', function() { it('binds a self-unregistering listener when callOnce is true', function() {
const bindTo = {id: 1}; const bindTo = {id: 1};
@@ -122,13 +121,14 @@ describe('ol.events', function() {
describe('listenOnce()', function() { describe('listenOnce()', function() {
it('creates a one-off listener', function() { it('creates a one-off listener', function() {
const target = new EventTarget();
const listener = sinon.spy(); const listener = sinon.spy();
const key = listenOnce(target, 'foo', listener); const key = listenOnce(target, 'foo', listener);
expect(add.callCount).to.be(1);
expect(key.callOnce).to.be(true); expect(key.callOnce).to.be(true);
key.boundListener(); target.dispatchEvent('foo');
expect(listener.callCount).to.be(1);
target.dispatchEvent('foo');
expect(listener.callCount).to.be(1); expect(listener.callCount).to.be(1);
expect(remove.callCount).to.be(1);
}); });
it('does not add the same listener twice', function() { it('does not add the same listener twice', function() {
const listener = function() {}; const listener = function() {};