diff --git a/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_bem.spec.js b/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_bem.spec.js index 9ecb85d7c..02a2944fa 100644 --- a/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_bem.spec.js +++ b/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_bem.spec.js @@ -269,6 +269,45 @@ describe('BEM events', function() { }); }); + describe('complex unbind on block destruct', function() { + var spy1, spy2, block1, block2, block3; + + beforeEach(function() { + spy1 = sinon.spy(); + spy2 = sinon.spy(); + + var Block = bemDom.declBlock('block'), + dom = initDom([ + { block : 'block' }, + { block : 'block' }, + { block : 'block' } + ]); + + block1 = dom.eq(0).bem(Block); + block2 = dom.eq(1).bem(Block); + block3 = dom.eq(2).bem(Block); + }); + + it('should properly unbind all handlers after destruct', function() { + block1._events(block2).on('click', spy1); + block1._events(block3).on('click', spy2); + block2._emit('click'); + block3._emit('click'); + + spy1.should.have.been.called; + spy2.should.have.been.called; + + spy1.reset(); + spy2.reset(); + bemDom.destruct(block1.domElem); + block2._emit('click'); + block3._emit('click'); + + spy1.should.have.not.been.called; + spy2.should.have.not.been.called; + }); + }); + describe('nested blocks events', function() { beforeEach(function() { Block1 = bemDom.declBlock('block', { diff --git a/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_dom.spec.js b/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_dom.spec.js index e460483c3..a90bc5717 100644 --- a/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_dom.spec.js +++ b/common.blocks/i-bem-dom/__events/_type/i-bem-dom__events_type_dom.spec.js @@ -146,6 +146,51 @@ describe('DOM events', function() { }); }); + describe('complex unbind on block destruct', function() { + var spy1, spy2, spy3, block1, block2; + beforeEach(function() { + spy1 = sinon.spy(); + spy2 = sinon.spy(); + spy3 = sinon.spy(); + + var Block = bemDom.declBlock('block'), + dom = createDomNode([ + { block : 'block' }, + { block : 'block' } + ]); + + block1 = dom.eq(0).bem(Block); + block2 = dom.eq(1).bem(Block); + }); + + it('should properly unbind all handlers', function() { + block1._domEvents(bemDom.win).on('resize', spy1); + block1._domEvents(bemDom.doc).on('click', spy2); + block1._domEvents(block2).on('click', spy3); + + bemDom.win.trigger('resize'); + bemDom.doc.trigger('click'); + block2.domElem.trigger('click'); + + spy1.should.have.been.called; + spy2.should.have.been.called; + spy3.should.have.been.called; + + spy1.reset(); + spy2.reset(); + spy3.reset(); + + bemDom.destruct(block1.domElem); + bemDom.win.trigger('resize'); + bemDom.doc.trigger('click'); + block2.domElem.trigger('click'); + + spy1.should.have.not.been.called; + spy2.should.have.not.been.called; + spy3.should.have.not.been.called; + }); + }); + describe('block elems events', function() { ['string', 'Class'].forEach(function(elemType) { var elem1, elem2; diff --git a/common.blocks/i-bem-dom/__events/i-bem-dom__events.js b/common.blocks/i-bem-dom/__events/i-bem-dom__events.js index 8fcb5522c..a3ce5817a 100644 --- a/common.blocks/i-bem-dom/__events/i-bem-dom__events.js +++ b/common.blocks/i-bem-dom/__events/i-bem-dom__events.js @@ -250,9 +250,10 @@ var undef, ctxStorage = eventStorage[ctxId] = {}; if(isBindToInstance) { ctx._events().on({ modName : 'js', modVal : '' }, function() { - params.bindToArbitraryDomElem && ctxStorage[storageKey] && - ctxStorage[storageKey].un(); - delete ctxStorage[ctxId]; + objects.each(ctxStorage, function(eventManager) { + eventManager.un(); + }); + delete eventStorage[ctxId]; }); } }