从coffeescript生成Javascript,相当于_.each下划线中的手动javascript

时间:2012-09-01 20:56:42

标签: coffeescript underscore.js

我在Javascript中有一个代码:

 _.each(this.collection.models, function (student) {
            $(this.el).append(new StudCloneItemView({ model: student }).el);
        }, this);    

我在coffescript中写这篇文章为

_.each this.collection.models  , (student) => 
$(@el).append new Item ({ model:student }).el   

生成

_.each(this.collection.models, function(student) {
      return $(_this.el).append(new Item({
        model: student
      }.el));
    });

根据我的要求,这是不可取的。生成的javascript中缺少“this”元素的最后一段。这很重要。

如何使用我为_.each提到的coffeescript生成顶部提到的javascript?

反正有吗?或者我错过了任何语法?

2 个答案:

答案 0 :(得分:1)

像这样:

_.each @collection.models, ((student) ->
  $(@el).append new StudCloneItemView(model: student).el
), this

答案 1 :(得分:1)

您的JavaScript:

_.each(this.collection.models, function (student) {
    $(this.el).append(new StudCloneItemView({ model: student }).el);
}, this);

以及=> CoffeeScript产生的内容:

var _this = this; // This is somewhere above your _.each in the generated JS
_.each(this.collection.models, function(student) {
    return $(_this.el).append(new Item({
        model: student
    }.el));
});

功能相同。您不需要_.each的上下文参数,因为=>会生成回调中使用的this(称为_this)的别名。


顺便说一句,Backbone集合有various Underscore methods mixed in,所以你不必说_.each(@collection.models, ...),你可以直接在集合上使用each

@collection.each (student) =>
    @$el.append(new StudCloneItemView(model: student).el)

我也切换到你的视图已经预先构建的$el,没有必要在每次迭代时构建一个新的jQuery对象。