summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/handlebars/compiler/javascript-compiler.js5
-rw-r--r--lib/handlebars/runtime.js12
-rw-r--r--spec/partials.js6
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}}';