diff --git a/packages/ember-htmlbars/lib/hooks/link-render-node.js b/packages/ember-htmlbars/lib/hooks/link-render-node.js
index 767161e1785..c47d511366e 100644
--- a/packages/ember-htmlbars/lib/hooks/link-render-node.js
+++ b/packages/ember-htmlbars/lib/hooks/link-render-node.js
@@ -6,13 +6,19 @@
import subscribe from 'ember-htmlbars/utils/subscribe';
import { isArray } from 'ember-runtime/utils';
import { chain, read, isStream, addDependency } from 'ember-metal/streams/utils';
+import { CONTAINS_DOT_CACHE } from 'ember-htmlbars/system/lookup-helper';
+import {
+ COMPONENT_HASH,
+ isComponentCell,
+ mergeInNewHash
+} from 'ember-htmlbars/keywords/closure-component';
export default function linkRenderNode(renderNode, env, scope, path, params, hash) {
if (renderNode.streamUnsubscribers) {
return true;
}
- var keyword = env.hooks.keywords[path];
+ let keyword = env.hooks.keywords[path];
if (keyword && keyword.link) {
keyword.link(renderNode.getState(), params, hash);
} else {
@@ -24,14 +30,30 @@ export default function linkRenderNode(renderNode, env, scope, path, params, has
}
}
+ // If has a dot in the path, we need to subscribe to the arguments in the
+ // closure component as well.
+
+ if (CONTAINS_DOT_CACHE.get(path)) {
+ let stream = env.hooks.get(env, scope, path);
+ let componentCell = stream.value();
+
+ if (isComponentCell(componentCell)) {
+ let closureAttrs = mergeInNewHash(componentCell[COMPONENT_HASH], hash);
+
+ for (let key in closureAttrs) {
+ subscribe(renderNode, env, scope, closureAttrs[key]);
+ }
+ }
+ }
+
if (params && params.length) {
- for (var i = 0; i < params.length; i++) {
+ for (let i = 0; i < params.length; i++) {
subscribe(renderNode, env, scope, params[i]);
}
}
if (hash) {
- for (var key in hash) {
+ for (let key in hash) {
subscribe(renderNode, env, scope, hash[key]);
}
}
@@ -43,9 +65,9 @@ export default function linkRenderNode(renderNode, env, scope, path, params, has
}
function eachParam(list) {
- var listChange = getKey(list, '[]');
+ let listChange = getKey(list, '[]');
- var stream = chain(list, function() {
+ let stream = chain(list, function() {
read(listChange);
return read(list);
}, 'each');
@@ -55,13 +77,13 @@ function eachParam(list) {
}
function shouldDisplay(predicate) {
- var length = getKey(predicate, 'length');
- var isTruthy = getKey(predicate, 'isTruthy');
+ let length = getKey(predicate, 'length');
+ let isTruthy = getKey(predicate, 'isTruthy');
- var stream = chain(predicate, function() {
- var predicateVal = read(predicate);
- var lengthVal = read(length);
- var isTruthyVal = read(isTruthy);
+ let stream = chain(predicate, function() {
+ let predicateVal = read(predicate);
+ let lengthVal = read(length);
+ let isTruthyVal = read(isTruthy);
if (isArray(predicateVal)) {
return lengthVal > 0;
diff --git a/packages/ember-htmlbars/tests/helpers/closure_component_test.js b/packages/ember-htmlbars/tests/helpers/closure_component_test.js
index 4d796fe7081..a95bc19d564 100644
--- a/packages/ember-htmlbars/tests/helpers/closure_component_test.js
+++ b/packages/ember-htmlbars/tests/helpers/closure_component_test.js
@@ -151,6 +151,32 @@ if (isEnabled('ember-contextual-components')) {
'greeting is bound');
});
+ QUnit.test('updates when curried hash arguments is bound in block form', function() {
+ owner.register(
+ 'template:components/-looked-up',
+ compile(`{{greeting}}`)
+ );
+
+ let template = compile(
+ `{{#with (hash comp=(component "-looked-up" greeting=greeting)) as |my|}}
+ {{#my.comp}}{{/my.comp}}
+ {{/with}}`
+ );
+
+ component = Component.extend({
+ [OWNER]: owner,
+ template
+ }).create();
+
+ runAppend(component);
+ equal(component.$().text().trim(), '', '-looked-up component rendered');
+ run(() => {
+ component.set('greeting', 'Hodi');
+ });
+ equal(component.$().text().trim(), `Hodi`,
+ 'greeting is bound');
+ });
+
QUnit.test('nested components overwrites named positional parameters', function() {
let LookedUp = Component.extend();
LookedUp.reopenClass({