2010-11-05 50 views
10

我想让自己熟悉CoffeeScript和backbone.js,并且我必须缺少一些东西。为什么我的CoffeeScript/backbone.js事件不能触发?

这CoffeeScript的:

MyView = Backbone.View.extend 
    events: { 
    "click" : "testHandler" 
    } 

    testHandler: -> 
    console.log "click handled" 
    return false 

view = new MyView {el: $('#test_container')} 
view.render() 

生成以下JavaScript:

(function() { 
    var MyView, view; 
    MyView = Backbone.View.extend({ 
    events: { 
     "click": "testHandler" 
    }, 
    testHandler: function() { 
     console.log("click handled"); 
     return false; 
    } 
    }); 
    view = new MyView({ 
    el: $('#test_container') 
    }); 
    view.render; 
}).call(this); 

click不会触发事件testHandler当我test_container点击。

如果我改变输出JavaScript来:

$(function() { 
    var MyView, view; 
    MyView = Backbone.View.extend({ 
    events: { 
     "click": "testHandler" 
    }, 
    testHandler: function() { 
     console.log("click handled"); 
     return false; 
    } 
    }); 
    view = new MyView({ 
    el: $('#test_container') 
    }); 
    view.render; 
}); 

卸下call(this)和追加$,一切正常。我错过了什么?

+0

它看起来像你使用jQuery。你想添加jQuery标签吗? – Angiosperm 2010-11-05 17:38:53

回答

7
(function() {}).call(this); 

只是一种在指定接收者时立即调用匿名函数的方法。它的工作原理基本上同样的方式为:

this.method = function() {}; 
this.method(); 

$(function() {}),至少在jQuery的,是

$(document).ready(function() {}) 

其运行给定功能时,DOM树已经完全构造的简写。这似乎是您的Backbone.View.extend功能正常工作的必要条件。

+0

Ahh好的,谢谢,这一整段时间我在想(function(){})。call(this)和$(function(){})是一样的。现在更有意义了。 – sefner 2010-11-05 17:48:23

5

对于使用的CoffeeScript和jQuery一起应用程序脚本,把你的代码在这种模板:

$ = jQuery 
$ -> 

    MyView = Backbone.View.extend 
    events: 
     "click": "testHandler" 
    testHandler: -> 
     console.log "click handled" 
     false 

    view = new MyView el: $('#test_container') 
    view.render() 
2

会发生什么事的看法,或者至少view.el是动态生成的?您可以调用view.delegateEvents()方法手动设置事件处理程序。

下面是用于在ParentView中呈现ChildView然后委派childView的事件的类似coffeescript。

window.ParentView = Backbone.View.extend 
    addOne: (thing) -> 
    view = new ChildView({model: thing}) 
    this.el.append view.render().el 
    view.delegateEvents() 
3

尝试使用CoffeeScript的类声明的语法,例如:

class BacklogView extends Backbone.View 
    constructor: (@el) -> 
    this.delegateEvents this.events 

    events: 
    "click" : "addStory" 

    # callbacks 
    addStory: -> 
    console.log 'it works!' 
+0

我发现一些时间后更好的解决方案..今天StackOverflow提醒自己(我赢得了一些徽章:) 所以更好的解决方案是在构造函数方法体的第一行调用超级,并放弃调用this.delegateEvents 。 祝你好运;) – alecnmk 2011-10-28 12:35:31

+0

在你的例子中有super()作为第一行为我工作的构造函数。 – 2011-11-22 22:20:09

相关问题