0

我是 Handlebars 的新手,虽然我找到了一种解决方法,但我想知道为什么一个注册的助手可以工作而一个不能。不起作用的示例是来自 HB 文档的示例。

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 助手(不起作用 - 上下文未定义):

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;
});

任何帮助表示赞赏。

4

1 回答 1

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>
于 2012-04-11T09:33:37.620 回答