mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
marko v3: custom iterator support
This commit is contained in:
parent
6752065e5a
commit
5fb7089624
@ -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;
|
||||
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
1
test/fixtures/render/autotest/for-iterator-attr/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/for-iterator-attr/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div>c</div><div>b</div><div>a</div>
|
||||
3
test/fixtures/render/autotest/for-iterator-attr/template.marko
vendored
Normal file
3
test/fixtures/render/autotest/for-iterator-attr/template.marko
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
<div for(item in ['a', 'b', 'c'] | iterator=data.reverseIterator)>
|
||||
${item}
|
||||
</div>
|
||||
1
test/fixtures/render/autotest/for-iterator-status-var-attr/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/for-iterator-status-var-attr/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
<div>2-c</div><div>1-b</div><div>0-a</div>
|
||||
3
test/fixtures/render/autotest/for-iterator-status-var-attr/template.marko
vendored
Normal file
3
test/fixtures/render/autotest/for-iterator-status-var-attr/template.marko
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
<div for(item in ['a', 'b', 'c'] | iterator=data.reverseIterator status-var=status )>
|
||||
${status.index}-${item}
|
||||
</div>
|
||||
9
test/fixtures/render/autotest/for-iterator-status-var-attr/test.js
vendored
Normal file
9
test/fixtures/render/autotest/for-iterator-status-var-attr/test.js
vendored
Normal 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);
|
||||
}
|
||||
}
|
||||
};
|
||||
1
test/fixtures/render/autotest/for-iterator-status-var/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/for-iterator-status-var/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
2-c1-b0-a
|
||||
3
test/fixtures/render/autotest/for-iterator-status-var/template.marko
vendored
Normal file
3
test/fixtures/render/autotest/for-iterator-status-var/template.marko
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
<for (item in ['a', 'b', 'c'] | iterator=data.reverseIterator status-var=status )>
|
||||
${status.index}-${item}
|
||||
</for>
|
||||
9
test/fixtures/render/autotest/for-iterator-status-var/test.js
vendored
Normal file
9
test/fixtures/render/autotest/for-iterator-status-var/test.js
vendored
Normal 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);
|
||||
}
|
||||
}
|
||||
};
|
||||
1
test/fixtures/render/autotest/for-iterator/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/for-iterator/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
||||
cba
|
||||
3
test/fixtures/render/autotest/for-iterator/template.marko
vendored
Normal file
3
test/fixtures/render/autotest/for-iterator/template.marko
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
<for(item in ['a', 'b', 'c'] | iterator=data.reverseIterator)>
|
||||
${item}
|
||||
</for>
|
||||
9
test/fixtures/render/autotest/for-iterator/test.js
vendored
Normal file
9
test/fixtures/render/autotest/for-iterator/test.js
vendored
Normal 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);
|
||||
}
|
||||
}
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user