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 () {