使用手柄在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

我试图用手柄注册助手,以允许在JSON对象上进行迭代。看起来是一个合适的解决方案。我把它转换成下面的咖啡脚本。当我使用这两个助手中的任何一个时,似乎都没有发生任何事情(对于香草JavaScript和咖啡脚本版本都是如此)。有什么想法吗

$ ->
  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('')