diff --git a/modules/angular2/src/upgrade/downgrade_ng2_adapter.ts b/modules/angular2/src/upgrade/downgrade_ng2_adapter.ts index a4984c48b2..e0051c4ae0 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)); } } diff --git a/modules/angular2/test/upgrade/upgrade_spec.ts b/modules/angular2/test/upgrade/upgrade_spec.ts index 53b085c69b..d60483d6c5 100644 --- a/modules/angular2/test/upgrade/upgrade_spec.ts +++ b/modules/angular2/test/upgrade/upgrade_spec.ts @@ -230,6 +230,35 @@ 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(); + + ng1Module.directive('ng1', () => { + return { + template: '
', + controller: function($rootScope, $timeout) { + $timeout(function() { $rootScope.destroyIt = 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(''); + adapter.bootstrap(element, ['ng1']) + .ready((ref) => {onDestroyed.subscribe(() => { + ref.dispose(); + async.done(); + })}); + })); }); describe('upgrade ng1 component', () => {