我有一个名为的助手printArray
,它只打印数组中的每个项目。当我在 JS 中定义数组并通过上下文对象将其传递给助手时,它的效果很好。我想要做的是在模板中定义数组,例如:
{{printArray arr=[1, 3, 4] }}
不幸的是,当这到达我的助手时,arr
关键点是undefined
. 是否有任何有效的语法可以在我的助手中获取数组而不在 javascript 中定义它?
我有一个名为的助手printArray
,它只打印数组中的每个项目。当我在 JS 中定义数组并通过上下文对象将其传递给助手时,它的效果很好。我想要做的是在模板中定义数组,例如:
{{printArray arr=[1, 3, 4] }}
不幸的是,当这到达我的助手时,arr
关键点是undefined
. 是否有任何有效的语法可以在我的助手中获取数组而不在 javascript 中定义它?
你可以使用 JavaScript 的arguments
数组来完成这样的事情。该arguments
数组使您可以访问调用时传递给函数的每个值。
这将允许您使用如下语法:
{{printArray 1 3 4}}
代码如下所示:
Handlebars.registerHelper('printArray', function() {
//Last argument is the options object.
var options = arguments[arguments.length - 1];
//Skip the last argument.
for(var i = 0; i < arguments.length - 1; ++i) {
//Do your thing with each array element.
}
//Return your results...
return '';
});
您几乎可以使用 来完成此操作eval()
,使用如下帮助器:
Handlebars.registerHelper('printArray', function(values) {
var array = eval(values);
if (array.constructor === Array()) {
...
}
}
以上允许您从模板中调用它:
{{printArray '[0, 1, 2]'}}
此方法的一个警告是您必须将数组作为字符串传递。
您需要使用另一个返回数组的助手
Template.ArrayDemo.helpers({
arrayValues: [1, 2, 3],
printArray: function(arr) {
for (i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
}
});
现在你可以做
{{printArray arr=arrayValues}}
您是否尝试过仅传入数组的括号值?
{{printArray [1, 3, 4]}}
我知道您可以轻松地将对象作为参数传递给车把辅助方法:
{{printArray {arr: [1, 3, 4]} }}
看看这些很棒的辅助方法,其中大部分是我从其他地方偷来的,其中一些是我编写或调整的……它们是我关于该主题的参考起点:
https://github.com/zeroasterisk/Presenteract/blob/master/client/lib/handlebar-helpers.js
您可以定义一个数组助手,如下所示。
Handlebars.registerHelper('array', function() {
return Array.prototype.slice.call(arguments, 0, -1);
}
{{printArray (array 1 3 4)}}
帮手:
printArray: (...options) => {
// remove unneeded properties
options.pop();
// return option array
return options;
}
模板:
{{printArray "banana" "apple" "orange" "kiwi"}}
回报:
["banana", "apple", "orange", "kiwi"]
您可以将它与其他助手一起使用:
{{#each (printArray "banana" "apple" "orange" "kiwi")}}
{{this}}
{{/each}}
{{printArray '1,3,4'}}
Handlebars.registerHelper("printArray", function(values){
let array = values.split(",");
console.log(array);
});