From 35f8a3515940cd7e4aaade8f20fa5fa9b334a1ac Mon Sep 17 00:00:00 2001 From: Jesse Rusak Date: Sat, 4 Jul 2015 16:05:11 -0400 Subject: [PATCH] [BUGFIX release] On re-render, ensure child views of non-dirty components get the correct parentView On re-render of a non-dirty component, the `env` was simply passed down when rendering the component's template, which means its parentView was wrong; this patch mimics what keywords already do to solve this for components. Fixes emberjs/ember.js#11554 (cherry picked from commit bc9dbcdd03305ec44f0c3167eccbc0c5d9dd3139) --- .../node-managers/component-node-manager.js | 5 +++ .../integration/component_invocation_test.js | 33 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/ember-htmlbars/lib/node-managers/component-node-manager.js b/packages/ember-htmlbars/lib/node-managers/component-node-manager.js index 3af513cc03a..5c680a85d61 100644 --- a/packages/ember-htmlbars/lib/node-managers/component-node-manager.js +++ b/packages/ember-htmlbars/lib/node-managers/component-node-manager.js @@ -308,6 +308,7 @@ export function createComponent(_component, isAngleBracket, _props, renderNode, component._renderNode = renderNode; renderNode.emberView = component; + renderNode.buildChildEnv = buildChildEnv; return component; } @@ -360,3 +361,7 @@ function mergeBindings(target, attrs) { return target; } + +function buildChildEnv(state, env) { + return env.childWithView(this.emberView); +} diff --git a/packages/ember-htmlbars/tests/integration/component_invocation_test.js b/packages/ember-htmlbars/tests/integration/component_invocation_test.js index 21e86b88687..ed96b75d414 100644 --- a/packages/ember-htmlbars/tests/integration/component_invocation_test.js +++ b/packages/ember-htmlbars/tests/integration/component_invocation_test.js @@ -752,7 +752,38 @@ QUnit.test('components in template of a yielding component should have the prope equal(outer.parentView, view, 'x-outer receives the ambient scope as its parentView'); }); -QUnit.test('components should receive the viewRegistry from the parent view', function() { +QUnit.test('newly-added sub-components get correct parentView', function() { + var outer, inner; + + registry.register('component:x-outer', Component.extend({ + init() { + this._super(...arguments); + outer = this; + } + })); + + registry.register('component:x-inner', Component.extend({ + init() { + this._super(...arguments); + inner = this; + } + })); + + view = EmberView.extend({ + template: compile('{{#x-outer}}{{#if view.showInner}}{{x-inner}}{{/if}}{{/x-outer}}'), + container: container, + showInner: false + }).create(); + + runAppend(view); + + run(() => { view.set('showInner', true); }); + + equal(inner.parentView, outer, 'receives the wrapping component as its parentView in template blocks'); + equal(outer.parentView, view, 'x-outer receives the ambient scope as its parentView'); +}); + +QUnit.test("components should receive the viewRegistry from the parent view", function() { var outer, innerTemplate, innerLayout; var viewRegistry = {};