2012-07-31 55 views

回答

2

CoffeeScript只是JavaScript上的一个语法层。它本质上是JavaScript。你可以在JavaScript中做任何事情,你可以在CoffeeScript中重现。

+0

参见例如https://github.com/PaulUithol/Backbone-relational/issues/91。我想知道CoffeeScript和主干集成是否还有其他问题。 – ipavlic 2012-07-31 14:25:48

3

CoffeeScript和Backbone.js都是由同一作者(Jeremy Ashkenas)编写的。 backbone-on-rails gem默认生成CoffeeScript。虽然某些插件(例如您提到的Backbone-relational)可能需要额外的设置,但Backbone本身与CoffeeScript搭配非常好。

6

没问题,真的。至少,没有哪个不容易解决。

使用CS的问题是你可能会在任何地方使用CS相同的问题:

  • 调试是在生成的JS
  • CS还是做需要一个预处理步骤,可以是有时尴尬
  • 你的团队的其余部分可能不知道CS
  • 大约有CS一些奇怪的事情(他们引入“类”,但他们不是真正的类)

此外,由于具有Coffeescript的Backbone dev是基于“class”的,因此您会发现自己希望将您的课程分为单独的文件夹和单独的文件夹。正因为如此,你可能会陷入这样一种情况,那就是这些课程无序定义。例如,你的集合可能在你的模型之前被定义,这是不可能发生的。为此,我建议使用可以管理依赖关系(导入)的东西。我使用coffee-toaster,但还有其他几个选项(例如,Rails具有内置到资产管道的依赖管理)

这是我首选编写Backbone代码的方式。在我看来,BackScript.js开发在CoffeeScript中比在Javascript中更好。对我而言,他们像巧克力和花生酱一起走到一起。 (不是每个人都喜欢巧克力/花生酱......并不是所有人都喜欢BB/CS)

类语义 骨干的发展在很大程度上依赖于扩大原型,这是内置有CoffeeScript的东西。所以,在这里,你会在JS扩展视图:

App.Models.MyModel = Backbone.View.extend({ 
    render: function() { 
     ... 
    } 
}); 

的CS替代是土生土长的经验:

class App.Models.MyModel extends Backbone.Model 
    render: -> 
     ... 

重写功能 有的东西你在骨干经常做,像重载函数变为更简单。在Javascript:

constructor: function (attributes, options) { 
    this.constructor.__super__.constructor.apply(this, arguments); 
    ... 
} 

变为:

constructor: (attributes, options) -> 
    super 

当你需要声明“此”语境中的CS绑定 “胖箭头”是真正有用的一个功能的情况下是“这“

当函数被回调时,Javascript设置'this'的方式不同。有几种方法来解决这个问题,但开箱即用,它是尴尬:

initialize: function() { 
    this.model.bind('reset', this.render); 
}, 

render: function() { 
    this.$el.html("<ul></ul>"); 
    this.model.each(this.renderItem); // <--- Fails on "reset" because 'this' is wrong 
    return this; 
} 

的CoffeeScript有=>令牌时它就会被人称为将自动绑定“这个”的功能:

initialize: -> 
    @model.bind 'reset', @render 

render: => 
    @$el.html '<ul></ul>' 
    @model.each @renderItem # The fat arrow fixed it for you 
    @ 

当所有事情都说完之后,Backbone.js代码更容易编写,并且在使用CS编写时更容易阅读。至少,这是我的看法。

祝你好运!

相关问题