将模板中写入的数组传递给meteor / handlebars helper

时间:2013-05-28 03:30:56

标签: meteor handlebars.js

我有一个名为printArray的助手,它只打印数组中的每个项目。当我在JS中定义数组并通过上下文对象将其传递给帮助程序时,它工作得很好。我想要做的是在模板中定义数组,如:

{{printArray arr=[1, 3, 4] }}

不幸的是,到达我的助手时,arr键指向undefined。是否有任何有效的语法来在我的助手中获取数组而不在javascript中定义它?

6 个答案:

答案 0 :(得分:8)

您可以使用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 '';
});

答案 1 :(得分:3)

使用eval(),使用这样的帮助器几乎可以实现这一点:

Handlebars.registerHelper('printArray', function(values) {
   var array = eval(values);

   if (array.constructor === Array()) {
     ...
   }
}

以上允许您从模板中调用它:

{{printArray '[0, 1, 2]'}}

对此方法的一个警告是,您必须将数组作为字符串传递。

答案 2 :(得分: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}}

答案 3 :(得分:1)

您是否尝试过传递数组的括号值?

{{printArray [1, 3, 4]}}

我知道你可以很容易地传入对象,作为把手辅助方法的参数:

{{printArray {arr: [1, 3, 4]} }}

看看这些令人敬畏的辅助方法,其中大部分是我从其他地方偷走的,其中一些是我编写或调整过的......它们是我在这个主题上的参考起点:

https://github.com/zeroasterisk/Presenteract/blob/master/client/lib/handlebar-helpers.js

答案 4 :(得分:1)

您可以定义一个数组助手,如下所示。

Handlebars.registerHelper('array', function() {
    return Array.prototype.slice.call(arguments, 0, -1);
}

{{printArray (array 1 3 4)}}

答案 5 :(得分:0)

{{printArray '1,3,4'}}

Handlebars.registerHelper("printArray", function(values){
    let array = values.split(",");
    console.log(array);
});