diff --git a/src/shared/Context.js b/src/shared/Context.js index 98c6404674..a7842e1a11 100755 --- a/src/shared/Context.js +++ b/src/shared/Context.js @@ -116,14 +116,16 @@ export default class Context { getParent(component) { let fragment = this.fragment; - if (fragment.context) - fragment = findParentWithContext(fragment.parent || (component && fragment.componentParent)); + if (!fragment.parent && component) fragment = fragment.componentParent; else { - fragment = findParentWithContext(fragment.parent || (component && fragment.componentParent)); - if (fragment) - fragment = findParentWithContext( - fragment.parent || (component && fragment.componentParent) - ); + if (fragment.context) fragment = findParentWithContext(fragment.parent); + else { + fragment = findParentWithContext(fragment.parent); + if (fragment) { + if (!fragment.parent && component) fragment = fragment.componentParent; + else fragment = findParentWithContext(fragment.parent); + } + } } if (!fragment || fragment === this.fragment) return; diff --git a/tests/browser/context.js b/tests/browser/context.js index 368a953c65..1239120a63 100644 --- a/tests/browser/context.js +++ b/tests/browser/context.js @@ -1251,4 +1251,22 @@ export default function() { t.equal(ctx.findAllComponents()[1].get('id'), 'second'); t.equal(ctx.findAllComponents()[2].get('id'), 'other'); }); + + test('parent context of ractive context for a component is the context immediately surrounding the component', t => { + const r = new Ractive({ + target: fixture, + template: '{{#with 99 as bar}}{{/with}}', + components: { + cmp: Ractive.extend() + }, + data: { + bar: 42 + } + }); + + const cmp = r.findComponent('cmp'); + const ctx = cmp.getContext().getParent(true); + + t.equal(ctx.get('bar'), 99); + }); }