From 9c0963b2b81098a8f864d3bbde8c07dcc07c4bbf Mon Sep 17 00:00:00 2001 From: Sashe Klechkovski Date: Wed, 13 Apr 2016 21:09:36 +0200 Subject: [PATCH] Fixed memory leak in valdrMessage-directive - registered listeners on $rootScope should always be unregistered on destroy - valdrFormGroupCtrl#removeMessageElement was retaining the reference to the element after it's removal [minor-leak] --- src/core/valdrFormGroup-directive.js | 7 +++++-- src/message/valdrMessage-directive.js | 6 +++++- src/message/valdrMessage-directive.spec.js | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/core/valdrFormGroup-directive.js b/src/core/valdrFormGroup-directive.js index 822fcc0..7ea37d6 100644 --- a/src/core/valdrFormGroup-directive.js +++ b/src/core/valdrFormGroup-directive.js @@ -98,7 +98,10 @@ var valdrFormGroupDirectiveDefinition = }; this.removeMessageElement = function (ngModelController) { - messageElements[ngModelController.$name].remove(); + if (messageElements[ngModelController.$name]) { + messageElements[ngModelController.$name].remove(); + delete messageElements[ngModelController.$name]; + } }; }] @@ -106,4 +109,4 @@ var valdrFormGroupDirectiveDefinition = }]; angular.module('valdr') - .directive('valdrFormGroup', valdrFormGroupDirectiveDefinition); \ No newline at end of file + .directive('valdrFormGroup', valdrFormGroupDirectiveDefinition); diff --git a/src/message/valdrMessage-directive.js b/src/message/valdrMessage-directive.js index 4aab2a1..e36e548 100644 --- a/src/message/valdrMessage-directive.js +++ b/src/message/valdrMessage-directive.js @@ -141,9 +141,13 @@ angular.module('valdr') } }, true); - $rootScope.$on('$translateChangeSuccess', function () { + var unregisterTranslateChangeHandler = $rootScope.$on('$translateChangeSuccess', function () { updateTranslations(); }); + + scope.$on('$destroy', function () { + unregisterTranslateChangeHandler(); + }); } }; }]); diff --git a/src/message/valdrMessage-directive.spec.js b/src/message/valdrMessage-directive.spec.js index 2bb3201..533a304 100644 --- a/src/message/valdrMessage-directive.spec.js +++ b/src/message/valdrMessage-directive.spec.js @@ -342,6 +342,21 @@ describe('valdrMessage directive with angular-translate', function () { expect(element.find('span').html()).toBe('field: Field Name param: 3 secondParam: 4'); }); + it('should unregister translate change handler on destroy to avoid potential memory leaks', function () { + // given + var element = compileTemplate(); + spyOn(valdrMessage, '$translate').andReturn({ then: function () {} }); + $scope.$destroy(); + element.remove(); + + // when + $translate.use('de'); + $scope.$digest(); + + // then + expect(valdrMessage.$translate).not.toHaveBeenCalled(); + }); + }); describe('valdrMessage directive with angular-translate and valdrFieldNameKeyGenerator', function () {