使用手柄在javascript对象上迭代
我试图用手柄注册助手,以允许在JSON对象上进行迭代。看起来是一个合适的解决方案。我把它转换成下面的咖啡脚本。当我使用这两个助手中的任何一个时,似乎都没有发生任何事情(对于香草JavaScript和咖啡脚本版本都是如此)。有什么想法吗使用手柄在javascript对象上迭代,javascript,ruby-on-rails,coffeescript,handlebars.js,Javascript,Ruby On Rails,Coffeescript,Handlebars.js,我试图用手柄注册助手,以允许在JSON对象上进行迭代。看起来是一个合适的解决方案。我把它转换成下面的咖啡脚本。当我使用这两个助手中的任何一个时,似乎都没有发生任何事情(对于香草JavaScript和咖啡脚本版本都是如此)。有什么想法吗 $ -> Handlebars.registerHelper "key_value", (obj, fn)-> buffer = "" key for key in obj if obj.hasOwnProp
$ ->
Handlebars.registerHelper "key_value", (obj, fn)->
buffer = ""
key
for key in obj
if obj.hasOwnProperty(key)
buffer += fn({key: key, value: obj[key]})
buffer
Handlebars.registerHelper "each_with_key", (obj, fn)->
context
buffer = ""
key
keyName = fn.hash.key
for key in obj
if obj.hasOwnProperty(key)
context = obj[key]
if keyName
context[keyName] = key
buffer += fn(context)
buffer
在模板中:
{{#key_value categories}}
I'M ALIVE!!
{{/key_value}}
{{#each_with_key categories key="category_id"}}
I'M ALIVE!!
{{/each_with_key}}
我目前正在使用gem文件中的
gem'handlebar assets'
将把手添加到rails应用程序。您的JavaScript到CoffeeScript的音译已中断。您不能将用于。。。在
中,要迭代CoffeeScript中的对象,请使用:
使用的表示对对象属性的理解,而不是数组中的值
此CoffeeScript循环:
for x in y
...
变成以下JavaScript:
for (_i = 0, _len = y.length; _i < _len; _i++) {
x = a[_i];
...
}
如果expr
超过一行或太长,无法进行可读理解
在CoffeeScript中,您的助手的正确且更惯用的版本更像这样:
Handlebars.registerHelper "key_value", (obj, fn)->
(fn(key: key, value: value) for own key, value of obj).join('')
Handlebars.registerHelper "each_with_key", (obj, fn)->
key_name = fn.hash.key
buffer = for own key, value of obj
value[key_name] = key
fn(value)
buffer.join('')
演示:
Handlebars.registerHelper "key_value", (obj, fn)->
(fn(key: key, value: value) for own key, value of obj).join('')
Handlebars.registerHelper "each_with_key", (obj, fn)->
key_name = fn.hash.key
buffer = for own key, value of obj
value[key_name] = key
fn(value)
buffer.join('')