From d09ec1c19df341d64fd0a7cde60afad704bca0c8 Mon Sep 17 00:00:00 2001 From: Nico Rehwaldt Date: Tue, 16 Feb 2016 10:31:12 +0100 Subject: [PATCH] feat(Viewer): add #off to remove event listeners Closes #470 --- lib/Viewer.js | 47 +++++++++++++++++++++++++++---- test/spec/ViewerSpec.js | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 5 deletions(-) diff --git a/lib/Viewer.js b/lib/Viewer.js index 868b366d..0e533758 100644 --- a/lib/Viewer.js +++ b/lib/Viewer.js @@ -25,7 +25,7 @@ function initListeners(diagram, listeners) { var events = diagram.get('eventBus'); listeners.forEach(function(l) { - events.on(l.event, l.priority, l.handler, l.that); + events.on(l.event, l.priority, l.callback, l.that); }); } @@ -365,17 +365,54 @@ Viewer.prototype.destroy = function() { /** * Register an event listener on the viewer * + * Remove a previously added listener via {@link #off(event, callback)}. + * * @param {String} event - * @param {Function} handler + * @param {Number} [priority] + * @param {Function} callback + * @param {Object} [that] */ -Viewer.prototype.on = function(event, priority, handler, that) { +Viewer.prototype.on = function(event, priority, callback, that) { var diagram = this.diagram, listeners = this.__listeners = this.__listeners || []; - listeners.push({ event: event, priority: priority, handler: handler, that: that }); + if (typeof priority === 'function') { + that = callback; + callback = priority; + priority = 1000; + } + + listeners.push({ event: event, priority: priority, callback: callback, that: that }); if (diagram) { - diagram.get('eventBus').on(event, priority, handler, that); + return diagram.get('eventBus').on(event, priority, callback, that); + } +}; + +/** + * De-register an event callback + * + * @param {String} event + * @param {Function} callback + */ +Viewer.prototype.off = function(event, callback) { + var filter, + diagram = this.diagram; + + if (callback) { + filter = function(l) { + return !(l.event === event && l.callback === callback); + }; + } else { + filter = function(l) { + return l.event !== event; + }; + } + + this.__listeners = (this.__listeners || []).filter(filter); + + if (diagram) { + diagram.get('eventBus').off(event, callback); } }; diff --git a/test/spec/ViewerSpec.js b/test/spec/ViewerSpec.js index c9aa5e4e..b9d22f0c 100644 --- a/test/spec/ViewerSpec.js +++ b/test/spec/ViewerSpec.js @@ -626,6 +626,68 @@ describe('Viewer', function() { }); + describe.only('#off', function() { + + var xml = require('../fixtures/bpmn/simple.bpmn'); + + it('should remove listener permanently', function(done) { + + // given + var viewer = new Viewer({ container: container }); + + var handler = function() { + return 'bar'; + }; + + viewer.on('foo', 1000, handler); + + // when + viewer.off('foo'); + + // then + viewer.importXML(xml, function(err) { + var eventBus = viewer.get('eventBus'); + + var result = eventBus.fire('foo'); + + expect(result).not.to.exist; + + done(); + }); + + }); + + + it('should remove listener on existing diagram instance', function(done) { + + // given + var viewer = new Viewer({ container: container }); + + var handler = function() { + return 'bar'; + }; + + viewer.on('foo', 1000, handler); + + // when + viewer.importXML(xml, function(err) { + var eventBus = viewer.get('eventBus'); + + // when + viewer.off('foo', handler); + + var result = eventBus.fire('foo'); + + expect(result).not.to.exist; + + done(); + }); + + }); + + }); + + describe('#destroy', function() { it('should remove traces in document tree', function() {