在骨干coffee-haml模板中迭代对象?

时间:2012-12-07 14:03:21

标签: ruby-on-rails backbone.js coffeescript hamlc

我正在尝试迭代骨干集合对象并将其中一个属性打印到haml-coffee模板(.hamlc)上的未链接列表中。

在上下文中,我有一组字体。我想在模板上打印每种字体的名称。

这就是想象代码的样子:

%ul
  - for font in @fonts
    %li
      = font.name

但是,这根本不会迭代。我可以在这个for循环中输入任何输入,但它根本不执行。

输出到console.log

时,这就是@fonts的样子
Object {0: Object, 1: Object, 2: Object, 3: Object, 4: Object…}
0: Object
_id: "50bed321dbc554c7a0000005"
data: Object
name: "Actor"
user_ids: Array[0]
__proto__: Object
1: Object
2: Object
3: Object

如何迭代此对象并输出并打印模板中的每个名称?

2 个答案:

答案 0 :(得分:0)

您似乎应该指定要显示的@fonts集合的哪个属性:

%ul
 - for font in @fonts.name
   %li
     = font

如果您想迭代对象或集合,请使用:

- for name, location of @fonts
  = name + "lives in" + location

(例如,如果您的fonts对象具有名称和位置属性)

在您的代码中,只需将'in'替换为'of'即可。

答案 1 :(得分:0)

假设您的收藏品看起来像这样

var fonts = new Backbone.Collection;
fonts.add([
    { name: 'arial'},
    { name: 'arial black'},
    { name: 'comic sans ms'}]);

您不能只使用

获取集合中第一个模型的名称
font = fonts.first()
font.name               // <--- undefined

原因是Backbone模型不允许您直接操作属性。他们有安装者和吸气剂。

font.get 'name'         // 'arial'

但回到这一点,你的模板很好,你只需要传递它的集合的JSON表示

var html = window.HAML.test({fonts:fonts.toJSON()});
document.getElementById('out').innerHTML = html;

如果由于某种原因,您不想将JSON表示传递给它,您可以将模型数组{fonts: fonts.models}传递给它,但是您必须修改模板并使用类似%li = font.get 'name'的内容

这是一个jsfiddle(第一部分是由coffee-haml生成的代码http://jsfiddle.net/jaimem/qRMqu/2/