Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit e35cd52

Browse files
WIP
1 parent 6388a34 commit e35cd52

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

src/ngMessages/messages.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,14 +683,18 @@ function ngMessageDirectiveFactory() {
683683
assignRecords(staticExp);
684684
}
685685

686-
var currentElement, messageCtrl;
686+
var currentElement, messageCtrl, neverAttached = true;
687+
console.log('register', commentNode);
687688
ngMessagesCtrl.register(commentNode, messageCtrl = {
688689
test: function(name) {
689690
return contains(records, name);
690691
},
691692
attach: function() {
693+
console.log('attach', currentElement, commentNode);
694+
neverAttached = false;
692695
if (!currentElement) {
693696
$transclude(function(elm, newScope) {
697+
console.log('newScope', newScope.$id, elm);
694698
$animate.enter(elm, null, element);
695699
currentElement = elm;
696700

@@ -702,6 +706,7 @@ function ngMessageDirectiveFactory() {
702706
// by another structural directive then it's time
703707
// to deregister the message from the controller
704708
currentElement.on('$destroy', function() {
709+
console.log('element destroy', currentElement);
705710
if (currentElement && currentElement.$$attachId === $$attachId) {
706711
ngMessagesCtrl.deregister(commentNode);
707712
messageCtrl.detach();
@@ -713,12 +718,22 @@ function ngMessageDirectiveFactory() {
713718
},
714719
detach: function() {
715720
if (currentElement) {
721+
console.log('detach', currentElement);
716722
var elm = currentElement;
717723
currentElement = null;
718724
$animate.leave(elm);
719725
}
720726
}
721727
});
728+
729+
console.log('setup destroy', scope.$id, commentNode);
730+
scope.$on('$destroy', function() {
731+
console.log('scope destroy', scope.$id, commentNode, currentElement);
732+
if (neverAttached) {
733+
console.log('never attached destroy', scope.$id, commentNode, currentElement);
734+
ngMessagesCtrl.deregister(commentNode);
735+
}
736+
});
722737
}
723738
};
724739
}];

test/helpers/testabilityPatch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ afterEach(function() {
6565
if (value && value.$element) {
6666
dump('LEAK', key, value.$id, sortedHtml(value.$element));
6767
} else {
68-
dump('LEAK', key, angular.toJson(value));
68+
dump('LEAK', key, value, value.$parent);
6969
}
7070
});
7171
});

test/ngMessages/messagesSpec.js

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
describe('ngMessages', function() {
3+
fdescribe('ngMessages', function() {
44
beforeEach(inject.strictDi());
55
beforeEach(module('ngMessages'));
66

@@ -491,7 +491,7 @@ describe('ngMessages', function() {
491491

492492
describe('ngMessage nested nested inside elements', function() {
493493

494-
it('should not crash or leak memory when the messages are transcluded, the first message is ' +
494+
fit('should not crash or leak memory when the messages are transcluded, the first message is ' +
495495
'visible, and ngMessages is removed by ngIf', function() {
496496

497497
module(function($compileProvider) {
@@ -636,6 +636,43 @@ describe('ngMessages', function() {
636636
})
637637
);
638638

639+
fit('should unregister the ngMessage even if it was never attached',
640+
inject(function($compile, $rootScope) {
641+
var html =
642+
'<div ng-messages="items">' +
643+
'<div ng-if="show"><div ng-message="x">ERROR</div></div>' +
644+
'</div>';
645+
646+
element = $compile(html)($rootScope);
647+
648+
var ctrl = element.controller('ngMessages');
649+
650+
$rootScope.$apply('show = true');
651+
expect(messageChildren(element).length).toBe(0);
652+
expect(Object.keys(ctrl.messages).length).toEqual(1);
653+
654+
$rootScope.$apply('show = false');
655+
expect(messageChildren(element).length).toBe(0);
656+
expect(Object.keys(ctrl.messages).length).toEqual(0);
657+
658+
// $rootScope.$apply('show = true');
659+
// expect(messageChildren(element).length).toBe(0);
660+
// expect(Object.keys(ctrl.messages).length).toEqual(1);
661+
662+
// $rootScope.$apply('show = false');
663+
// expect(messageChildren(element).length).toBe(0);
664+
// expect(Object.keys(ctrl.messages).length).toEqual(0);
665+
666+
// $rootScope.$apply('show = true');
667+
// expect(messageChildren(element).length).toBe(0);
668+
// expect(Object.keys(ctrl.messages).length).toEqual(1);
669+
670+
// $rootScope.$apply('show = false');
671+
// expect(messageChildren(element).length).toBe(0);
672+
// expect(Object.keys(ctrl.messages).length).toEqual(0);
673+
})
674+
);
675+
639676

640677
describe('when including templates', function() {
641678
they('should work with a dynamic collection model which is managed by ngRepeat',

0 commit comments

Comments
 (0)