diff --git a/packages/ember-glimmer/lib/renderer.js b/packages/ember-glimmer/lib/renderer.js index 9521864722f..b1f8cdb76b7 100644 --- a/packages/ember-glimmer/lib/renderer.js +++ b/packages/ember-glimmer/lib/renderer.js @@ -140,12 +140,12 @@ class Renderer { } register(view) { - assert('Attempted to register a view with an id already in use: ' + view.elementId, !this._viewRegistry[this.elementId]); + assert('Attempted to register a view with an id already in use: ' + view.elementId, !this._viewRegistry[view.elementId]); this._viewRegistry[view.elementId] = view; } unregister(view) { - delete this._viewRegistry[this.elementId]; + delete this._viewRegistry[view.elementId]; } remove(view) { diff --git a/packages/ember-glimmer/tests/integration/components/life-cycle-test.js b/packages/ember-glimmer/tests/integration/components/life-cycle-test.js index f52213d5e53..6eed11b3029 100644 --- a/packages/ember-glimmer/tests/integration/components/life-cycle-test.js +++ b/packages/ember-glimmer/tests/integration/components/life-cycle-test.js @@ -9,6 +9,7 @@ class LifeCycleHooksTest extends RenderingTest { super(); this.hooks = []; this.components = {}; + this.componentRegistry = []; this.teardownAssertions = []; } @@ -42,9 +43,25 @@ class LifeCycleHooksTest extends RenderingTest { }; } + assertRegisteredViews(label) { + let viewRegistry = this.owner.lookup('-view-registry:main'); + let actual = Object.keys(viewRegistry).sort(); + let expected = this.componentRegistry.slice().sort(); + + this.assert.deepEqual(actual, expected, 'registered views - ' + label); + } + registerComponent(name, { template = null }) { let pushComponent = (instance) => { this.components[name] = instance; + this.componentRegistry.push(instance.elementId); + }; + + let removeComponent = (instance) => { + let index = this.componentRegistry.indexOf(instance); + this.componentRegistry.splice(index, 1); + + delete this.components[name]; }; let pushHook = (hookName, args) => { @@ -141,6 +158,11 @@ class LifeCycleHooksTest extends RenderingTest { pushHook('willClearRender'); assertParentView('willClearRender', this); assertElement('willClearRender', this); + }, + + willDestroy() { + removeComponent(this); + this._super(...arguments); } }); @@ -179,6 +201,7 @@ class LifeCycleHooksTest extends RenderingTest { this.render(invoke('the-top', { twitter: expr('twitter') }), { twitter: '@tomdale' }); this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net'); + this.assertRegisteredViews('intial render'); let topAttrs = { twitter: '@tomdale' }; let middleAttrs = { name: 'Tom Dale' }; @@ -399,6 +422,8 @@ class LifeCycleHooksTest extends RenderingTest { ['the-bottom', 'willDestroyElement'], ['the-bottom', 'willClearRender'] ); + + this.assertRegisteredViews('after destroy'); }); } @@ -426,6 +451,7 @@ class LifeCycleHooksTest extends RenderingTest { this.render(invoke('the-top', { twitter: expr('twitter') }), { twitter: '@tomdale' }); this.assertText('Top: Middle: Bottom: @tomdale'); + this.assertRegisteredViews('intial render'); let topAttrs = { twitter: '@tomdale' }; let middleAttrs = { twitterTop: '@tomdale' }; @@ -574,6 +600,8 @@ class LifeCycleHooksTest extends RenderingTest { ['the-bottom', 'willDestroyElement'], ['the-bottom', 'willClearRender'] ); + + this.assertRegisteredViews('after destroy'); }); } @@ -599,6 +627,7 @@ class LifeCycleHooksTest extends RenderingTest { }); this.assertText('Item: 1Item: 2Item: 3Item: 4Item: 5'); + this.assertRegisteredViews('intial render'); let initialHooks = (count) => { return [ @@ -669,6 +698,8 @@ class LifeCycleHooksTest extends RenderingTest { ['no-items', 'willDestroyElement'], ['no-items', 'willClearRender'] ); + + this.assertRegisteredViews('after destroy'); }); } } diff --git a/packages/ember-htmlbars/lib/renderer.js b/packages/ember-htmlbars/lib/renderer.js index 21e587b77ca..92729b2826c 100755 --- a/packages/ember-htmlbars/lib/renderer.js +++ b/packages/ember-htmlbars/lib/renderer.js @@ -276,12 +276,12 @@ Renderer.prototype.didDestroyElement = function (view) { Renderer.prototype.register = function Renderer_register(view) { - assert('Attempted to register a view with an id already in use: ' + view.elementId, !this._viewRegistry[this.elementId]); + assert('Attempted to register a view with an id already in use: ' + view.elementId, !this._viewRegistry[view.elementId]); this._viewRegistry[view.elementId] = view; }; Renderer.prototype.unregister = function Renderer_unregister(view) { - delete this._viewRegistry[this.elementId]; + delete this._viewRegistry[view.elementId]; }; export const InertRenderer = {