Skip to content

Commit

Permalink
Enhance Transformer event handling and add unit test for cleanup of s…
Browse files Browse the repository at this point in the history
…ubscriptions. Ensure event listeners are properly managed on transformer destruction. fix #1872
  • Loading branch information
lavrton committed Jan 22, 2025
1 parent 9e790a3 commit 9b989b4
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 4 deletions.
10 changes: 6 additions & 4 deletions src/shapes/Transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()}`
Expand Down
45 changes: 45 additions & 0 deletions test/unit/Transformer-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
);
});
});

0 comments on commit 9b989b4

Please sign in to comment.