From 1805502de406700b5041f115297580c786420f95 Mon Sep 17 00:00:00 2001 From: Sergey Belozyorcev Date: Thu, 21 Jun 2018 01:54:56 +0300 Subject: [PATCH] Fix unbind on block destruct --- .../_type/i-bem-dom__events_type_bem.spec.js | 38 +++++++++++++++---- .../_type/i-bem-dom__events_type_dom.spec.js | 2 + .../i-bem-dom/__events/i-bem-dom__events.js | 7 ++-- 3 files changed, 36 insertions(+), 11 deletions(-) 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..82e8aac2f 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 @@ -203,7 +203,7 @@ describe('BEM events', function() { }); describe('block instance events', function() { - var block2_1, block2_2; + var block1, block2_1, block2_2, block3_1, block3_2; beforeEach(function() { Block1 = bemDom.declBlock('block1', { onSetMod : { @@ -222,14 +222,27 @@ describe('BEM events', function() { }); Block2 = bemDom.declBlock('block2'); + Block3 = bemDom.declBlock('block3'); - block1 = initDom({ - block : 'block1', - content : [ - { block : 'block2' }, - { block : 'block2' } - ] - }).bem(Block1); + var dom = initDom([ + { + block : 'block1', + content : [ + { block : 'block2' }, + { block : 'block2' } + ] + }, + { block : 'block3' }, + { block : 'block3' }, + ]); + + block1 = dom.eq(0).bem(Block1); + + block3_1 = dom.eq(1).bem(Block3); + block3_2 = dom.eq(2).bem(Block3); + + block1._events(block3_1).on('click', spy6); + block1._events(block3_2).on('click', spy7); }); it('should properly bind handlers', function() { @@ -267,6 +280,15 @@ describe('BEM events', function() { spy1.should.not.have.been.called; spy3.should.have.been.called; }); + + it('should properly unbind all handlers on block destruct', function() { + bemDom.destruct(block1.domElem); + block3_1._emit('click'); + block3_2._emit('click'); + + spy6.should.have.not.been.called; + spy7.should.have.not.been.called; + }); }); describe('nested blocks events', function() { 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..b3575470b 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 @@ -745,9 +745,11 @@ describe('DOM events', function() { it('should properly unbind all handlers on block destruct', function() { bemDom.destruct(block1.domElem); rootNode.trigger('click'); + rootNode.trigger('dblclick'); spy1.should.not.have.been.called; spy2.should.not.have.been.called; + spy4.should.not.have.been.called; }); }); }); 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]; }); } }