Expose the initial context via @root

This commit is contained in:
kpdecker
2014-01-15 09:41:53 -06:00
parent d841ad5962
commit f650b0d69e
4 changed files with 25 additions and 3 deletions
@@ -121,7 +121,7 @@ JavaScriptCompiler.prototype = {
var copies = "helpers = this.merge(helpers, " + namespace + ".helpers);";
if (this.environment.usePartial) { copies = copies + " partials = this.merge(partials, " + namespace + ".partials);"; }
if (this.options.data) { copies = copies + " data = data || {};"; }
if (this.options.data) { copies = copies + " data = this.initData(depth0, data);"; }
out.push(copies);
} else {
out.push('');
+8 -1
View File
@@ -1,6 +1,6 @@
module Utils from "./utils";
import Exception from "./exception";
import { COMPILER_REVISION, REVISION_CHANGES } from "./base";
import { COMPILER_REVISION, REVISION_CHANGES, createFrame } from "./base";
export function checkRevision(compilerInfo) {
var compilerRevision = compilerInfo && compilerInfo[0] || 1,
@@ -56,6 +56,13 @@ export function template(templateSpec, env) {
}
return programWrapper;
},
initData: function(context, data) {
data = data ? createFrame(data) : {};
if (!('root' in data)) {
data.root = context;
}
return data;
},
merge: function(param, common) {
var ret = param || common;
+15
View File
@@ -236,4 +236,19 @@ describe('data', function() {
equals("sad world?", result, "Overriden data output by helper");
});
describe('@root', function() {
it('the root context can be looked up via @root', function() {
var template = CompilerContext.compile('{{@root.foo}}');
var result = template({foo: 'hello'}, { data: {} });
equals('hello', result);
result = template({foo: 'hello'}, {});
equals('hello', result);
});
it('passed root values take priority', function() {
var template = CompilerContext.compile('{{@root.foo}}');
var result = template({}, { data: {root: {foo: 'hello'} } });
equals('hello', result);
});
});
});
+1 -1
View File
@@ -2,7 +2,7 @@ define(['handlebars.runtime'], function(Handlebars) {
Handlebars = Handlebars["default"]; var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
return templates['empty'] = template(function (Handlebars,depth0,helpers,partials,data) {
this.compilerInfo = [4,'>= 1.0.0'];
helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
helpers = this.merge(helpers, Handlebars.helpers); data = this.initData(depth0, data);
var buffer = "";