diff --git a/packages/ember-glimmer/tests/integration/application/engine-test.js b/packages/ember-glimmer/tests/integration/application/engine-test.js index ac36c9d475b..f38cd88640e 100644 --- a/packages/ember-glimmer/tests/integration/application/engine-test.js +++ b/packages/ember-glimmer/tests/integration/application/engine-test.js @@ -227,4 +227,27 @@ moduleFor('Application test: engine rendering', class extends ApplicationTest { ], 'the expected hooks were fired'); }); } + + ['@test deactivate should be called on Engine Routes before destruction'](assert) { + assert.expect(3); + + this.setupAppAndRoutableEngine(); + + this.registerEngine('blog', Engine.extend({ + init() { + this._super(...arguments); + this.register('template:application', compile('Engine{{outlet}}')); + this.register('route:application', Route.extend({ + deactivate() { + assert.notOk(this.isDestroyed, 'Route is not destroyed'); + assert.notOk(this.isDestroying, 'Route is not being destroyed'); + } + })); + } + })); + + return this.visit('/blog').then(() => { + this.assertText('ApplicationEngine'); + }); + } }); diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index 85073c7269d..4d5c8124a61 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -452,20 +452,21 @@ const EmberRouter = EmberObject.extend(Evented, { }, willDestroy() { - let instances = this._engineInstances; - for (let name in instances) { - for (let id in instances[name]) { - run(instances[name][id], 'destroy'); - } - } - if (this._toplevelView) { this._toplevelView.destroy(); this._toplevelView = null; } + this._super(...arguments); this.reset(); + + let instances = this._engineInstances; + for (let name in instances) { + for (let id in instances[name]) { + run(instances[name][id], 'destroy'); + } + } }, /*