From 140406f69441b5716900670b56e4eba4aaeeacc9 Mon Sep 17 00:00:00 2001 From: Andrei Alecu Date: Wed, 13 Jan 2016 16:35:48 +0200 Subject: [PATCH 1/3] fix(upgrade): leak when angular1 destroys element Fixes #6401 --- modules/angular2/src/upgrade/downgrade_ng2_adapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/angular2/src/upgrade/downgrade_ng2_adapter.ts b/modules/angular2/src/upgrade/downgrade_ng2_adapter.ts index a4984c48b2db..e0051c4ae005 100644 --- a/modules/angular2/src/upgrade/downgrade_ng2_adapter.ts +++ b/modules/angular2/src/upgrade/downgrade_ng2_adapter.ts @@ -160,7 +160,7 @@ export class DowngradeNg2ComponentAdapter { } registerCleanup() { - this.element.bind('$remove', () => this.viewManager.destroyRootHostView(this.hostViewRef)); + this.element.bind('$destroy', () => this.viewManager.destroyRootHostView(this.hostViewRef)); } } From 833d9a1933b54ca7f5be1131547953455d78ffce Mon Sep 17 00:00:00 2001 From: Andrei Alecu Date: Wed, 3 Feb 2016 15:50:11 +0200 Subject: [PATCH 2/3] fix(upgrade): leak when angular1 destroys element, add test --- modules/angular2/test/upgrade/upgrade_spec.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/modules/angular2/test/upgrade/upgrade_spec.ts b/modules/angular2/test/upgrade/upgrade_spec.ts index a64ad2fe9671..e17f30a05cda 100644 --- a/modules/angular2/test/upgrade/upgrade_spec.ts +++ b/modules/angular2/test/upgrade/upgrade_spec.ts @@ -221,6 +221,37 @@ export function main() { }); })); + + it('should properly run cleanup when ng1 directive is destroyed', inject([AsyncTestCompleter], (async) => { + var adapter: UpgradeAdapter = new UpgradeAdapter(); + var ng1Module = angular.module('ng1', []); + var onDestroyed: EventEmitter = new EventEmitter(); + + var Ng2 = + Component({ + selector: 'ng2', + template: "test" + }) + .Class({ + constructor: function() { + + }, + ngOnDestroy: function(changes) { + onDestroyed.emit(true); + } + }); + ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); + var element = html(`
+ +
`); + adapter.bootstrap(element, ['ng1']) + .ready((ref) => { + onDestroyed.subscribe(() => { + ref.dispose(); + async.done(); + }) + }); + })); }); describe('upgrade ng1 component', () => { From 078f7208eb7ded731be6fca809fe6730e9a61c60 Mon Sep 17 00:00:00 2001 From: Andrei Alecu Date: Wed, 3 Feb 2016 18:07:43 +0200 Subject: [PATCH 3/3] fix(upgrade): leak when angular1 destroys element, fix test --- modules/angular2/test/upgrade/upgrade_spec.ts | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/modules/angular2/test/upgrade/upgrade_spec.ts b/modules/angular2/test/upgrade/upgrade_spec.ts index a1219c8ee14a..40eff3515562 100644 --- a/modules/angular2/test/upgrade/upgrade_spec.ts +++ b/modules/angular2/test/upgrade/upgrade_spec.ts @@ -222,35 +222,33 @@ export function main() { })); - it('should properly run cleanup when ng1 directive is destroyed', inject([AsyncTestCompleter], (async) => { + it('should properly run cleanup when ng1 directive is destroyed', + inject([AsyncTestCompleter], (async) => { var adapter: UpgradeAdapter = new UpgradeAdapter(); var ng1Module = angular.module('ng1', []); - var onDestroyed: EventEmitter = new EventEmitter(); + var onDestroyed: EventEmitter = new EventEmitter(); - var Ng2 = - Component({ - selector: 'ng2', - template: "test" - }) - .Class({ - constructor: function() { + ng1Module.directive('ng1', () => { + return { + template: '
', + controller: function($rootScope, $timeout) { + $timeout(function() { $rootScope.destroyIt = true; }); + } + }; + }); - }, - ngOnDestroy: function(changes) { - onDestroyed.emit(true); - } - }); + var Ng2 = Component({selector: 'ng2', template: 'test'}) + .Class({ + constructor: function() {}, + ngOnDestroy: function() { onDestroyed.emit('destroyed'); } + }); ng1Module.directive('ng2', adapter.downgradeNg2Component(Ng2)); - var element = html(`
- -
`); + var element = html(''); adapter.bootstrap(element, ['ng1']) - .ready((ref) => { - onDestroyed.subscribe(() => { - ref.dispose(); - async.done(); - }) - }); + .ready((ref) => {onDestroyed.subscribe(() => { + ref.dispose(); + async.done(); + })}); })); });