From 9b989b41aacb1bb8c5c68b295691382db2135790 Mon Sep 17 00:00:00 2001 From: Anton Lavrevov Date: Wed, 22 Jan 2025 09:02:12 -0500 Subject: [PATCH] Enhance Transformer event handling and add unit test for cleanup of subscriptions. Ensure event listeners are properly managed on transformer destruction. fix #1872 --- src/shapes/Transformer.ts | 10 ++++---- test/unit/Transformer-test.ts | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/shapes/Transformer.ts b/src/shapes/Transformer.ts index 3c254a515..6918da177 100644 --- a/src/shapes/Transformer.ts +++ b/src/shapes/Transformer.ts @@ -335,10 +335,12 @@ export class Transformer extends Group { this.update(); } }; - const additionalEvents = node._attrsAffectingSize - .map((prop) => prop + 'Change.' + this._getEventNamespace()) - .join(' '); - node.on(additionalEvents, onChange); + if (node._attrsAffectingSize.length) { + const additionalEvents = node._attrsAffectingSize + .map((prop) => prop + 'Change.' + this._getEventNamespace()) + .join(' '); + node.on(additionalEvents, onChange); + } node.on( TRANSFORM_CHANGE_STR.map( (e) => e + `.${this._getEventNamespace()}` diff --git a/test/unit/Transformer-test.ts b/test/unit/Transformer-test.ts index af6782df1..1c930314d 100644 --- a/test/unit/Transformer-test.ts +++ b/test/unit/Transformer-test.ts @@ -5088,4 +5088,49 @@ describe('Transformer', function () { }, 100); }, 100); }); + + it('should properly clean up subscriptions on detach/destroy', function () { + var stage = addStage(); + var layer = new Konva.Layer(); + stage.add(layer); + + var rect = new Konva.Rect({ + x: 100, + y: 60, + width: 100, + height: 100, + fill: 'yellow', + }); + layer.add(rect); + // draw to attach all listeners + layer.draw(); + + // Count initial number of event listeners + var initialListeners = Object.keys(rect.eventListeners).length; + + // Create and attach first transformer + var tr1 = new Konva.Transformer({ + nodes: [rect], + }); + layer.add(tr1); + + // Destroy first transformer + tr1.destroy(); + + // Create and attach second transformer + var tr2 = new Konva.Transformer({ + nodes: [rect], + }); + layer.add(tr2); + + // Destroy second transformer + tr2.destroy(); + + // Check that we have same number of listeners as initially + assert.equal( + Object.keys(rect.eventListeners).length, + initialListeners, + 'Event listeners should be cleaned up properly' + ); + }); });