diff options
-rw-r--r-- | lib/handlebars/compiler/javascript-compiler.js | 5 | ||||
-rw-r--r-- | lib/handlebars/runtime.js | 12 | ||||
-rw-r--r-- | spec/partials.js | 6 |
3 files changed, 16 insertions, 7 deletions
diff --git a/lib/handlebars/compiler/javascript-compiler.js b/lib/handlebars/compiler/javascript-compiler.js index a8544d5..ef02cc7 100644 --- a/lib/handlebars/compiler/javascript-compiler.js +++ b/lib/handlebars/compiler/javascript-compiler.js @@ -369,7 +369,7 @@ JavaScriptCompiler.prototype = { var i = 0, len = parts.length; - if (!scoped && this.isChild && this.options.compat && !this.lastContext) { + if (!scoped && this.options.compat && !this.lastContext) { // The depthed query is expected to handle the undefined logic for the root level that // is implemented below, so we evaluate that directly in compat mode this.pushStackLiteral(this.depthedLookup(parts[i++])); @@ -619,6 +619,9 @@ JavaScriptCompiler.prototype = { if (this.options.data) { params.push("data"); } + if (this.options.compat) { + params.push('depths'); + } this.push("this.invokePartial(" + params.join(", ") + ")"); }, diff --git a/lib/handlebars/runtime.js b/lib/handlebars/runtime.js index de6ea1b..bfdb3b4 100644 --- a/lib/handlebars/runtime.js +++ b/lib/handlebars/runtime.js @@ -31,15 +31,15 @@ export function template(templateSpec, env) { // for external users to override these as psuedo-supported APIs. env.VM.checkRevision(templateSpec.compiler); - var invokePartialWrapper = function(partial, indent, name, context, hash, helpers, partials, data) { + var invokePartialWrapper = function(partial, indent, name, context, hash, helpers, partials, data, depths) { if (hash) { context = Utils.extend({}, context, hash); } - var result = env.VM.invokePartial.call(this, partial, name, context, helpers, partials, data); + var result = env.VM.invokePartial.call(this, partial, name, context, helpers, partials, data, depths); if (result == null && env.compile) { - var options = { helpers: helpers, partials: partials, data: data }; + var options = { helpers: helpers, partials: partials, data: data, depths: depths }; partials[name] = env.compile(partial, { data: data !== undefined, compat: templateSpec.compat }, env); result = partials[name](context, options); } @@ -126,7 +126,7 @@ export function template(templateSpec, env) { } var depths; if (templateSpec.useDepths) { - depths = [context]; + depths = options.depths ? [context].concat(options.depths) : [context]; } return templateSpec.main.call(container, context, container.helpers, container.partials, data, depths); @@ -166,8 +166,8 @@ export function program(container, i, fn, data, depths) { return prog; } -export function invokePartial(partial, name, context, helpers, partials, data) { - var options = { partial: true, helpers: helpers, partials: partials, data: data }; +export function invokePartial(partial, name, context, helpers, partials, data, depths) { + var options = { partial: true, helpers: helpers, partials: partials, data: data, depths: depths }; if(partial === undefined) { throw new Exception("The partial " + name + " could not be found"); diff --git a/spec/partials.js b/spec/partials.js index 9c8fdbc..208d038 100644 --- a/spec/partials.js +++ b/spec/partials.js @@ -157,6 +157,12 @@ describe('partials', function() { }); describe('compat mode', function() { + it('partials can access parents', function() { + var string = 'Dudes: {{#dudes}}{{> dude}}{{/dudes}}'; + var partial = '{{name}} ({{url}}) {{root}} '; + var hash = {root: 'yes', dudes: [{name: 'Yehuda', url: 'http://yehuda'}, {name: 'Alan', url: 'http://alan'}]}; + shouldCompileToWithPartials(string, [hash, {}, {dude: partial}, true], true, 'Dudes: Yehuda (http://yehuda) yes Alan (http://alan) yes '); + }); it('partials inherit compat', function() { var string = 'Dudes: {{> dude}}'; var partial = '{{#dudes}}{{name}} ({{url}}) {{root}} {{/dudes}}'; |