marko v3: custom iterator support

This commit is contained in:
Patrick Steele-Idem 2015-12-28 11:45:40 -07:00
parent 6752065e5a
commit 5fb7089624
15 changed files with 57 additions and 19 deletions

View File

@ -10,6 +10,7 @@ class ForEach extends Node {
this.body = this.makeContainer(def.body);
this.separator = def.separator;
this.statusVarName = def.statusVarName;
this.iterator = def.iterator;
ok(this.varName, '"varName" is required');
ok(this.in != null, '"in" is required');
@ -20,6 +21,7 @@ class ForEach extends Node {
var inExpression = this.in;
var separator = this.separator;
var statusVarName = this.statusVarName;
var iterator = this.iterator;
var builder = generator.builder;
@ -27,7 +29,18 @@ class ForEach extends Node {
statusVarName = '__loop';
}
if (statusVarName) {
if (iterator) {
let params = [varName];
if (statusVarName) {
params.push(statusVarName);
}
return builder.functionCall(iterator, [
inExpression,
builder.functionDeclaration(null, params, this.body)
]);
} else if (statusVarName) {
let forEachVarName = generator.addStaticVar('forEachWithStatusVar', '__helpers.fv');
let body = this.body;

View File

@ -1 +0,0 @@
cba2-c1-b0-a<div>c</div><div>b</div><div>a</div><div>2-c</div><div>1-b</div><div>0-a</div>

View File

@ -1,17 +0,0 @@
<for each="item in ['a', 'b', 'c']" iterator="data.reverseIterator">
${item}
</for>
<for each="item in ['a', 'b', 'c']" iterator="data.reverseIterator" status-var="status">
${status.index}-${item}
</for>
<div for="item in ['a', 'b', 'c']; iterator=data.reverseIterator">
${item}
</div>
<div for="item in ['a', 'b', 'c']; iterator=data.reverseIterator; status-var=status">
${status.index}-${item}
</div>

View File

@ -0,0 +1 @@
<div>c</div><div>b</div><div>a</div>

View File

@ -0,0 +1,3 @@
<div for(item in ['a', 'b', 'c'] | iterator=data.reverseIterator)>
${item}
</div>

View File

@ -0,0 +1 @@
<div>2-c</div><div>1-b</div><div>0-a</div>

View File

@ -0,0 +1,3 @@
<div for(item in ['a', 'b', 'c'] | iterator=data.reverseIterator status-var=status )>
${status.index}-${item}
</div>

View File

@ -0,0 +1,9 @@
exports.templateData = {
reverseIterator: function(arrayList, callback){
var statusVar = {first: 0, last: arrayList.length-1};
for(var i=arrayList.length-1; i>=0; i--){
statusVar.index = i;
callback(arrayList[i], statusVar);
}
}
};

View File

@ -0,0 +1 @@
2-c1-b0-a

View File

@ -0,0 +1,3 @@
<for (item in ['a', 'b', 'c'] | iterator=data.reverseIterator status-var=status )>
${status.index}-${item}
</for>

View File

@ -0,0 +1,9 @@
exports.templateData = {
reverseIterator: function(arrayList, callback){
var statusVar = {first: 0, last: arrayList.length-1};
for(var i=arrayList.length-1; i>=0; i--){
statusVar.index = i;
callback(arrayList[i], statusVar);
}
}
};

View File

@ -0,0 +1 @@
cba

View File

@ -0,0 +1,3 @@
<for(item in ['a', 'b', 'c'] | iterator=data.reverseIterator)>
${item}
</for>

View File

@ -0,0 +1,9 @@
exports.templateData = {
reverseIterator: function(arrayList, callback){
var statusVar = {first: 0, last: arrayList.length-1};
for(var i=arrayList.length-1; i>=0; i--){
statusVar.index = i;
callback(arrayList[i], statusVar);
}
}
};