我遇到了这个问题并用一些辅助函数解决了它。这个想法是创建一些帮助器来进行数学计算和比较,然后创建一个帮助器来查找对象中的特定条目。
数学:
Handlebars.registerHelper({
add: function () {
'use strict';
var total = 0;
var i = arguments.length;
while (i--) {
if (typeof arguments[i] === 'number') {
total += arguments[i];
}
}
return total;
},
subtract: function () {
'use strict';
var total = 0;
var i = arguments.length;
while (i--) {
if (typeof arguments[i] === 'number') {
total -= arguments[i];
}
}
return total;
},
multiply: function () {
'use strict';
var total = 0;
var i = arguments.length;
while (i--) {
if (typeof arguments[i] === 'number') {
total *= arguments[i];
}
}
return total;
},
divide: function () {
'use strict';
var total = 0;
var i = arguments.length;
while (i--) {
if (typeof arguments[i] === 'number') {
total /= arguments[i];
}
}
return total;
},
modulus: function () {
'use strict';
var total = 0;
var i = arguments.length;
while (i--) {
if (typeof arguments[i] === 'number') {
total %= arguments[i];
}
}
return total;
},
});
比较:
Handlebars.registerHelper({
eq: function (v1, v2) {
'use strict';
return v1 === v2;
},
ne: function (v1, v2) {
'use strict';
return v1 !== v2;
},
lt: function (v1, v2) {
'use strict';
return v1 < v2;
},
gt: function (v1, v2) {
'use strict';
return v1 > v2;
},
lte: function (v1, v2) {
'use strict';
return v1 <= v2;
},
gte: function (v1, v2) {
'use strict';
return v1 >= v2;
},
and: function (v1, v2) {
'use strict';
return v1 && v2;
},
or: function (v1, v2) {
'use strict';
return v1 || v2;
},
});
以及在对象中查找特定项目的功能:
Handlebars.registerHelper('getValueByPath', function () {
'use strict';
var options = arguments[arguments.length - 1];
var result = options.data.root;
// the options object is the last in the list of arguments; don't loop over it
for (var i = 0; i < arguments.length - 1; i++) {
try {
result = result[arguments[i]];
} catch (err) {
return null;
}
}
return result;
});
那么它可以像这样使用:
{{#each item}}
{{#if (eq (getValueByPath "items" (add @index 1) "property") property)}}
// do something
{{else}}
// do something else
{{/if}}
{{/each}