将模板中写入的数组传递给流星/车把助手

Posted

技术标签:

【中文标题】将模板中写入的数组传递给流星/车把助手【英文标题】:Pass array written in template to meteor/handlebars helper 【发布时间】:2013-05-22 22:01:09 【问题描述】:

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

printArray arr=[1, 3, 4] 

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

【问题讨论】:

【参考方案1】:

您是否尝试过仅传入数组中括号内的值?

printArray [1, 3, 4]

我知道您可以轻松地将对象作为参数传递给车把辅助方法:

printArray arr: [1, 3, 4] 

看看这些很棒的辅助方法,其中大部分是我从别处偷来的,其中一些是我编写或调整的……它们是我在该主题上的参考起点:

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

【讨论】:

这些看起来很棒,但我一定是误会了——我在对象的左大括号上得到了Expecting 'CLOSE', 'DATA', 'STRING', 'INTEGER', 'BOOLEAN', 'ID', 'SEP', got 'INVALID'。这种语法是否可以在普通的 Handlebars 中允许但在流星中不允许? 感谢您的代码链接。你能指出你在哪里使用这些助手吗? 这里是getSessiongithub.com/zeroasterisk/Presenteract/blob/master/client/views/…的例子【参考方案2】:

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

【讨论】:

【参考方案3】:

您几乎可以通过使用eval() 来完成此操作,使用这样的帮助器:

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

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

上面允许你从模板中调用它:

printArray '[0, 1, 2]'

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

【讨论】:

【参考方案4】:

你需要使用另一个返回数组的助手

Template.ArrayDemo.helpers(
    arrayValues: [1, 2, 3],
    printArray: function(arr) 
        for (i = 0; i < arr.length; i++) 
            console.log(arr[i]);
        
    
 );

现在可以了

printArray arr=arrayValues

【讨论】:

【参考方案5】:

您可以如下定义数组助手。

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


printArray (array 1 3 4)

【讨论】:

【参考方案6】:
printArray '1,3,4'

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

【讨论】:

考虑添加更多关于代码的解释,答案应该提供更多关于代码的解释,以使答案更有用并且更有可能吸引投票【参考方案7】:

助手:

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

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于将模板中写入的数组传递给流星/车把助手的主要内容,如果未能解决你的问题,请参考以下文章

如何将下拉值传递给模板助手。 [流星+火焰]

如何将主干视图连接到流星车把模板?

如何从车把模板访问主干模型的计算字段?

如何从车把模板访问主干模型的计算字段?

如何在流星的车把助手中使用多个参数?

“this”似乎在车把“每个”助手中的旧迭代中具有价值(在 mandrill 模板中使用)