Coffeescript类和Handlebars模板和自定义块助手

时间:2013-03-04 06:16:53

标签: javascript coffeescript handlebars.js

当我在变量上使用 Handlebars.compile 时效果很好,但是当我将该函数放在Coffee类属性上时,它会给我 undefined ,bug?或者我想念一些基本的java / coffee功能?

有我的小提琴:http://jsfiddle.net/Cl0udW4lk3r/BpY5b/

class Test
  template: Handlebars.compile (
    """
    {{#iterate data}}
        <p>{{data}}</p>
    {{/iterate}}
    """
  )

template = Handlebars.compile (
  """
  {{#iterate data}}
    <p>{{data}}</p>
  {{/iterate}}
  """
)

行动中还有另一个小提琴:http://jsfiddle.net/Cl0udW4lk3r/D3FR9/20/

----更新-----

我的第一个小提琴已经解决了(但是把手的版本已经过时了),错误是一个愚蠢的OOP疏忽......

但是!我的第二个小提琴(现在我已经更新了第一小提琴的把手资源,也是我的第一个小提琴......)给我一个错误

  

TypeError:回调不是函数

似乎回调部分没有正确处理......咖啡类或简单变量情况下的错误都相同......

2 个答案:

答案 0 :(得分:3)

当你这样说时:

class Test
  template: ...

您将template定义为实例属性,因此您必须先创建一个实例才能查看template

t = new Test
console.log(t.template)

或者你可以从template的原型中挖出Test

console.log(Test::template)

如果您希望template成为类属性,那么:

class Test
  @template: ...

演示:http://jsfiddle.net/ambiguous/tvDpN/


您的第二个问题与Handlebars助手的调用方式有关。最后一个参数曾经是回调函数,您将fn.inverse用于{{else}}块。帮助器的最后一个参数现在是一个对象,其函数位于.fn,而else-block函数位于.inverse。所以对于Handlebars的最新版本,你的助手:

Handlebars.registerHelper 'iterate', (context, callback) ->
    switch typeof context
        when 'object' then (callback(key: key, value: value) for own key, value of context).join ''

看起来应该更像这样:

Handlebars.registerHelper 'iterate', (context, options) ->
    switch typeof context
        when 'object' then (options.fn(key: key, value: value) for own key, value of context).join ''

演示:http://jsfiddle.net/ambiguous/NQZTG/

答案 1 :(得分:2)

这是因为您正在检查template类本身的Test属性,而不是实例化Test类的新实例并检查该实例上的属性。以下应该有效:

$ ->
  console.log new Test().template
  console.log template