2011-11-25 51 views
0

我正在与backbone.js进入一个盲点。我写了这段代码,我试图做的就是获得 测试div在按钮单击时呈现。如果我在initialize()函数内调用render(),它会渲染。 但是,我从不触发render()函数来响应点击事件。Backbone.js/Coffeescript - 映射简单的点击事件

我错过了什么?

谢谢!

HTML集装箱

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset='utf-8' /> 
    <!--/Always force latest IE rendering engine (even in intranet) & Chrome Frame --> 
    <meta content='IE=edge,chrome=1' /> 
    <meta http-equiv='X-UA-Compatible' /> 
    <link type="text/css" rel="stylesheet" href="/stylesheets/site.css" media="screen" /> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script> 
    <script type="text/javascript" src="/javascripts/underscore-min.js"></script> 
    <script type="text/javascript" src="/javascripts/backbone-min.js"></script> 
    <script type="text/javascript" src="/javascripts/application.js"></script> 
    <script type="text/javascript" src="/javascripts/sample_data.js"></script> 
    <title>The Middleman!</title> 
    </head> 
    <body class='page_classes'> 
    <div id='main' role='main'> 
     <h1>The Middleman is watching.</h1> 
     <div id='band-app'> 
     <button id='new-band'>new band</button> 
     </div> 
    </div> 
    </body> 
</html> 

CoffeeScript的简单视图

SAMPLE_TEMPLATE = """ 
<div id="my-fine-id"> 
    My fine id!!! 
</div> 
""" 

$ -> 
    class AppView extends Backbone.View 
    render: -> 
     console.log "rendering" 
     @template = _.template SAMPLE_TEMPLATE, {} 
     @el.html @template 

    initialize: -> 
     console.log "constructing" 
     @el = $('#band-app') 
     @events = {"click button#new-band": "render"} 

    app = new AppView() 

回答

0

我觉得delegateEvents,其中规定了事件处理,被称为在View构造,initialize之前调用,所以要么调用它明确地在您的initialize方法中(在您设置了events地图之后),或者确保events地图设置为构建的一部分类本身,请参阅:

http://documentcloud.github.com/backbone/#View-extend

+0

谢谢!我使用'constructor:'函数,但切换到'initialize:'以便让Backbone构造。在'initialize:'中分配事件哈希后立即调用'@delegateEvents()'解决了这个问题。 –

1

马吕斯说什么是正确的。

通常,您希望在类定义中指定events,而不是在初始化程序中。实际上,对于此示例,您根本不需要initialize函数:

class AppView extends Backbone.View 

    events: 
    'click button': 'render' 

    render: -> 
    @$el.html _.template SAMPLE_TEMPLATE, {} 

$ -> 
    new AppView el:$('#band-app') 
+0

而另一半的问题是他正在'initialize'中更改'@ el',在较新的Backbone中他应该使用['setElement'](http://documentcloud.github.com/backbone/#View-setElement )(在'@ events'设置之后)。 –