我遇到了一个盲点与backbone.js。我写了这段代码,我要做的就是得到要在按钮单击时呈现的测试div。如果我在initialize()
函数中调用render()
,它就会渲染。然而,我从来没有触发render()
函数响应点击事件。
我错过了什么?
谢谢!
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 for simple view
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()
马吕斯说得对。
通常您希望在类定义中指定events
,而不是在初始化器中指定。实际上,对于本例,您根本不需要initialize
函数:
class AppView extends Backbone.View
events:
'click button': 'render'
render: ->
@$el.html _.template SAMPLE_TEMPLATE, {}
$ ->
new AppView el:$('#band-app')
我认为delegateEvents
,它设置事件处理,在initialize
被调用之前,在View
构造函数中调用,因此要么在initialize
方法中显式调用它(在您设置了events
映射之后),要么确保events
映射被设置为构建View
类本身的一部分,参见:
http://documentcloud.github.com/backbone/View-extend