Unlisten before calling listener and bind to target by default

This commit is contained in:
Andreas Hocevar
2016-02-25 17:32:55 +01:00
parent fa180cfa13
commit 00a0f14743
2 changed files with 24 additions and 14 deletions

View File

@@ -107,11 +107,12 @@ ol.events.ListenerObjType;
*/
ol.events.bindListener_ = function(listenerObj) {
var boundListener = function(evt) {
var rv = listenerObj.listener.call(listenerObj.bindTo, evt);
var listener = listenerObj.listener;
var bindTo = listenerObj.bindTo || listenerObj.target;
if (listenerObj.callOnce) {
ol.events.unlistenByKey(listenerObj);
}
return rv;
return listener.call(bindTo, evt);
}
listenerObj.boundListener = boundListener;
return boundListener;

View File

@@ -24,23 +24,32 @@ describe('ol.events', function() {
boundListener();
expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.bindTo);
});
it('binds a self-unregistering listener when callOnce is true', function() {
var bindTo = {id: 1};
var listener = sinon.spy();
target.removeEventListener = function() {};
it('binds to the target when bindTo is not provided', function() {
var listenerObj = {
type: 'foo',
target: target,
listener: listener,
bindTo: bindTo,
callOnce: true
listener: sinon.spy(),
target: {id: 1}
};
var boundListener = ol.events.bindListener_(listenerObj);
expect(listenerObj.boundListener).to.equal(boundListener);
var spy = sinon.spy(ol.events, 'unlistenByKey');
boundListener();
expect(listener.thisValues[0]).to.equal(bindTo);
expect(spy.firstCall.args[0]).to.eql(listenerObj);
expect(listenerObj.listener.thisValues[0]).to.equal(listenerObj.target);
});
it('binds a self-unregistering listener when callOnce is true', function() {
var bindTo = {id: 1};
var listenerObj = {
type: 'foo',
target: target,
bindTo: bindTo,
callOnce: true
};
var unlistenSpy = sinon.spy(ol.events, 'unlistenByKey');
listenerObj.listener = function() {
expect(this).to.equal(bindTo);
expect(unlistenSpy.firstCall.args[0]).to.eql(listenerObj);
}
var boundListener = ol.events.bindListener_(listenerObj);
expect(listenerObj.boundListener).to.equal(boundListener);
boundListener();
ol.events.unlistenByKey.restore();
});
});