Skip to content

Commit

Permalink
Merge pull request #392 from wycats/root-data
Browse files Browse the repository at this point in the history
Access to root context in partials and helpers
  • Loading branch information
kpdecker committed Jan 15, 2014
2 parents d841ad5 + f650b0d commit cb80f46
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 3 deletions.
2 changes: 1 addition & 1 deletion lib/handlebars/compiler/javascript-compiler.js
Expand Up @@ -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('');
Expand Down
9 changes: 8 additions & 1 deletion lib/handlebars/runtime.js
@@ -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,
Expand Down Expand Up @@ -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;

Expand Down
15 changes: 15 additions & 0 deletions spec/data.js
Expand Up @@ -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);
});
});
});
2 changes: 1 addition & 1 deletion spec/expected/empty.amd.js
Expand Up @@ -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 = "";


Expand Down

0 comments on commit cb80f46

Please sign in to comment.