正如问题的标题所说,是否有一种循环对象属性的胡须/把手方式?
所以与
var o = {
bob : 'For sure',
roger: 'Unknown',
donkey: 'What an ass'
}
然后我可以在模板引擎中做一些相当于
for(var prop in o)
{
// with say, prop a variable in the template and value the property value
}
?
正如问题的标题所说,是否有一种循环对象属性的胡须/把手方式?
所以与
var o = {
bob : 'For sure',
roger: 'Unknown',
donkey: 'What an ass'
}
然后我可以在模板引擎中做一些相当于
for(var prop in o)
{
// with say, prop a variable in the template and value the property value
}
?
Handlebars.js 中已添加对此功能的支持,因此不再需要外部帮助程序。
对于数组:
{{#each myArray}}
Index: {{@index}} Value = {{this}}
{{/each}}
对于对象:
{{#each myObject}}
Key: {{@key}} Value = {{this}}
{{/each}}
请注意,只有通过hasOwnProperty
测试的属性才会被枚举。
作为助手实际上很容易实现:
Handlebars.registerHelper('eachProperty', function(context, options) {
var ret = "";
for(var prop in context)
{
ret = ret + options.fn({property:prop,value:context[prop]});
}
return ret;
});
然后像这样使用它:
{{#eachProperty object}}
{{property}}: {{value}}<br/>
{{/eachProperty }}
编辑:Handlebars 现在有一个内置的方法来完成这个;请参阅上面选择的答案。使用普通 Mustache 时,以下内容仍然适用。
Mustache 可以遍历数组中的项目。所以我建议创建一个单独的数据对象,其格式设置为 Mustache 可以使用的方式:
var o = {
bob : 'For sure',
roger: 'Unknown',
donkey: 'What an ass'
},
mustacheFormattedData = { 'people' : [] };
for (var prop in o){
if (o.hasOwnProperty(prop)){
mustacheFormattedData['people'].push({
'key' : prop,
'value' : o[prop]
});
}
}
现在,您的 Mustache 模板将类似于:
{{#people}}
{{key}} : {{value}}
{{/people}}
在此处查看“非空列表”部分:https : //github.com/janl/mustache.js
这是@Ben 的答案,已更新以与 Ember 一起使用...请注意,您必须使用它,Ember.get
因为上下文是作为字符串传入的。
Ember.Handlebars.registerHelper('eachProperty', function(context, options) {
var ret = "";
var newContext = Ember.get(this, context);
for(var prop in newContext)
{
if (newContext.hasOwnProperty(prop)) {
ret = ret + options.fn({property:prop,value:newContext[prop]});
}
}
return ret;
});
模板:
{{#eachProperty object}}
{{key}}: {{value}}<br/>
{{/eachProperty }}
@Amit 的回答很好,因为它适用于 Mustache 和 Handlebars。
至于 Handlebars-only 解决方案,我已经看到了一些,我最喜欢https://gist.github.com/1371586 上的each_with_key
块助手。
'key'
、 或'property'
等的对象键。