initial implementation of events#once

This commit is contained in:
iirvine 2013-04-12 15:21:48 -07:00
parent 54b2887667
commit e41e8a886a
2 changed files with 85 additions and 0 deletions

View File

@ -245,4 +245,66 @@ describe('Events', function() {
expect(spy3.called).to.be(true); expect(spy3.called).to.be(true);
}); });
}); });
describe('#once', function(){
it('removes event listeners after first fire', function() {
var obj = new Klass(),
spy = new sinon.spy();
obj.once('test', spy);
obj.fire('test');
expect(spy.called).to.be(true);
obj.fire('test');
expect(spy.callCount).to.be.lessThan(2);
});
it('works with object hash', function() {
var obj = new Klass(),
spy = new sinon.spy(),
otherSpy = new sinon.spy();
obj.once({
test: spy,
otherTest: otherSpy
});
obj.fire('test');
obj.fire('otherTest');
expect(spy.called).to.be(true);
expect(otherSpy.called).to.be(true);
obj.fire('test');
obj.fire('otherTest');
expect(spy.callCount).to.be.lessThan(2);
expect(otherSpy.callCount).to.be.lessThan(2);
});
it('only removes the fired event handler', function(){
var obj = new Klass(),
spy = new sinon.spy(),
otherSpy = new sinon.spy();
obj.once({
test: spy,
otherTest: otherSpy
});
obj.fire('test');
expect(spy.called).to.be(true);
expect(otherSpy.called).to.be(false);
obj.fire('otherTest');
expect(otherSpy.called).to.be(true);
expect(spy.callCount).to.be.lessThan(2);
expect(otherSpy.callCount).to.be.lessThan(2);
});
});
}); });

View File

@ -148,6 +148,29 @@ L.Mixin.Events = {
} }
return this; return this;
},
once: function(types, fn, context) {
handlerFor = function(fn, type, context) {
var handler = function() {
this.removeEventListener(type, fn, context);
this.removeEventListener(type, handler, context);
}
return handler;
}
if (typeof types === 'object') {
for (type in types) {
if (types.hasOwnProperty(type)) {
this.addEventListener(type, types[type], fn);
this.addEventListener(type, handlerFor(types[type], type, fn), fn);
}
}
return this;
}
this.addEventListener(types, fn, context);
return this.addEventListener(types, handlerFor(fn, types, context), context);
} }
}; };