Make each helper data uniform

Provide @key and @last value for all forms of iteration.

Fixes #910
This commit is contained in:
kpdecker
2014-11-26 08:02:55 -06:00
parent e4c874d1af
commit 3a9440f954
2 changed files with 36 additions and 19 deletions
+26 -19
View File
@@ -117,36 +117,43 @@ function registerDefaultHelpers(instance) {
data = createFrame(options.data);
}
function execIteration(key, i, last) {
if (data) {
data.key = key;
data.index = i;
data.first = i === 0;
data.last = !!last;
if (contextPath) {
data.contextPath = contextPath + key;
}
}
ret = ret + fn(context[key], { data: data });
}
if(context && typeof context === 'object') {
if (isArray(context)) {
for(var j = context.length; i<j; i++) {
if (data) {
data.index = i;
data.first = (i === 0);
data.last = (i === (context.length-1));
if (contextPath) {
data.contextPath = contextPath + i;
}
}
ret = ret + fn(context[i], { data: data });
execIteration(i, i, i === context.length-1);
}
} else {
var priorKey;
for(var key in context) {
if(context.hasOwnProperty(key)) {
if(data) {
data.key = key;
data.index = i;
data.first = (i === 0);
if (contextPath) {
data.contextPath = contextPath + key;
}
// We're running the iterations one step out of sync so we can detect
// the last iteration without have to scan the object twice and create
// an itermediate keys array.
if (priorKey) {
execIteration(priorKey, i-1);
}
ret = ret + fn(context[key], {data: data});
priorKey = key;
i++;
}
}
if (priorKey) {
execIteration(priorKey, i-1, true);
}
}
}
+10
View File
@@ -173,6 +173,16 @@ describe('builtin helpers', function() {
equal(result, "GOODBYE! cruel world!", "The @last variable is used");
});
it("each object with @last", function() {
var string = "{{#each goodbyes}}{{#if @last}}{{text}}! {{/if}}{{/each}}cruel {{world}}!";
var hash = {goodbyes: {'foo': {text: "goodbye"}, bar: {text: "Goodbye"}}, world: "world"};
var template = CompilerContext.compile(string);
var result = template(hash);
equal(result, "Goodbye! cruel world!", "The @last variable is used");
});
it("each with nested @last", function() {
var string = "{{#each goodbyes}}({{#if @last}}{{text}}! {{/if}}{{#each ../goodbyes}}{{#if @last}}{{text}}!{{/if}}{{/each}}{{#if @last}} {{text}}!{{/if}}) {{/each}}cruel {{world}}!";
var hash = {goodbyes: [{text: "goodbye"}, {text: "Goodbye"}, {text: "GOODBYE"}], world: "world"};