将模板中写入的数组传递给流星/车把助手
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 中允许但在流星中不允许?
感谢您的代码链接。你能指出你在哪里使用这些助手吗?
这里是getSession
github.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。以上是关于将模板中写入的数组传递给流星/车把助手的主要内容,如果未能解决你的问题,请参考以下文章