From 07ea1892c3eea8e341b792d48412708d46c5bda3 Mon Sep 17 00:00:00 2001 From: Marten Schilstra Date: Mon, 14 Dec 2015 13:56:24 +0100 Subject: [PATCH] [WIP][BUGFIX Beta] Positional param clash on rerender of contextual component helper --- .../lib/utils/extract-positional-params.js | 5 +-- .../tests/helpers/closure_component_test.js | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/ember-htmlbars/lib/utils/extract-positional-params.js b/packages/ember-htmlbars/lib/utils/extract-positional-params.js index 8747920396b..0eb4690c7d6 100644 --- a/packages/ember-htmlbars/lib/utils/extract-positional-params.js +++ b/packages/ember-htmlbars/lib/utils/extract-positional-params.js @@ -1,6 +1,6 @@ import { assert } from 'ember-metal/debug'; import { Stream } from 'ember-metal/streams/stream'; -import { readArray } from 'ember-metal/streams/utils'; +import { isStream, readArray } from 'ember-metal/streams/utils'; export default function extractPositionalParams(renderNode, component, params, attrs) { let positionalParams = component.positionalParams; @@ -25,9 +25,10 @@ function processNamedPositionalParameters(renderNode, positionalParams, params, for (let i = 0; i < limit; i++) { let param = params[i]; + let isActiveStreamParam = isStream(param) && param.isActive; assert(`You cannot specify both a positional param (at position ${i}) and the hash argument \`${positionalParams[i]}\`.`, - !(positionalParams[i] in attrs)); + isActiveStreamParam || !(positionalParams[i] in attrs)); attrs[positionalParams[i]] = param; } diff --git a/packages/ember-htmlbars/tests/helpers/closure_component_test.js b/packages/ember-htmlbars/tests/helpers/closure_component_test.js index a95bc19d564..ee67003eac3 100644 --- a/packages/ember-htmlbars/tests/helpers/closure_component_test.js +++ b/packages/ember-htmlbars/tests/helpers/closure_component_test.js @@ -339,6 +339,38 @@ if (isEnabled('ember-contextual-components')) { }, `You cannot specify both a positional param (at position 0) and the hash argument \`name\`.`); }); + QUnit.test('conflicting positional and hash parameters does not raise and assertion if rerendered', function() { + let LookedUp = Component.extend(); + LookedUp.reopenClass({ + positionalParams: ['name'] + }); + owner.register( + 'component:-looked-up', + LookedUp + ); + owner.register( + 'template:components/-looked-up', + compile(`{{greeting}} {{name}}`) + ); + + let template = compile( + `{{component (component "-looked-up" name greeting="Hodi")}}` + ); + + component = Component.extend({ + [OWNER]: owner, + template, + name: 'Hodari' + }).create(); + + runAppend(component); + equal(component.$().text(), 'Hodi Hodari', 'component is rendered'); + + run(() => component.set('name', 'Sergio')); + + equal(component.$().text(), 'Hodi Sergio', 'component is rendered'); + }); + QUnit.test('conflicting positional and hash parameters does not raise and assertion if in the different closure', function() { let LookedUp = Component.extend(); LookedUp.reopenClass({