把手EACH迭代器错误

时间:2012-04-03 19:26:58

标签: javascript handlebars.js

我是Handlebars的新手,当我找到一个解决方法时,我想知道为什么一个注册助手工作而一个没有。不起作用的示例是HB docs中的一个示例。

HTML:

<ul class="global-nav clearfix">
  {{#each data}}
 <li><a href="{{href}}">{{text}}</a></li>
 {{/each}}
</ul>
...
<ul class="content-nav clearfix">
  {{#each data}}
  <li><a href="{{href}}">{{text}}</a></li>
  {{/each}}
</ul>

数据:

var nav = [
  {
    name: 'global',
    selector: $('.global-nav'),
    data: [
      {
        text: 'Page 1',
        href: 'page1.html'
      }, {
        text: 'Page 2',
        href: 'page2.html'
      }
    ],

    name: 'content',
    selector: $('.content-nav'),
    data: [
      {
        text: 'Section 1',
        href: '#section1'
      }, {
        text: 'Section 2',
        href: '#section2'
      }
    ]
  }
];

编译器:

$.each(nav, function() {
  var obj = this,
      src = obj.selector.html(),
      template = Handlebars.compile(src),
      html = template(obj.data);

  obj.selector.html(html);
});

HB Helper(不起作用 - 上下文未定义):

Handlebars.registerHelper('each', function(context, options) {
  var ret = "";

  for(var i=0, j=context.length; i<j; i++) {
    ret = ret + options.fn(context[i]);
  }

  return ret;
});

HB Helper(使用this代替上下文工作):

Handlebars.registerHelper('each', function(context, options) {
  var ret = "";

  for(var i=0, j=this.length; i<j; i++) {
    ret = ret + options.fn(this[i]);
  }

  return ret;
});

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在查看JS的其余部分之前,我是否可以指出JSON看起来不对。

第二次在JSON中出现名称,选择器和数据时会被覆盖。如果这只是因为在粘贴到SO时忽略了一些位,那么请忽略我; o)

但如果 是真正的JSON,那么在查看任何功能之前需要更改

<script>
var nav = [
{
  name: 'global',
  selector: $('.global-nav'),
  data: [
    {
      text: 'Page 1',
      href: 'page1.html'
    }, {
      text: 'Page 2',
      href: 'page2.html'
    }
  ]
}, // this line 
{  // and this line added
  name: 'content',
  selector: $('.content-nav'),
  data: [
    {
      text: 'Section 1',
      href: '#section1'
    }, {
      text: 'Section 2',
      href: '#section2'
    }
  ]
}
];
</script>