[英]Why are my CoffeeScript/backbone.js events not firing?
我正在嘗試熟悉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);
但是當我點擊test_container
時, click
事件不會觸發testHandler
。
如果我將輸出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)
並追加$
,一切都按預期工作。 我錯過了什么?
(function () {}).call(this);
只是一種在指定接收器時立即調用匿名函數的方法。 它的工作原理基本相同:
this.method = function () {};
this.method();
$(function () {})
,至少在jQuery中,是簡寫
$(document).ready(function () {})
在完全構造DOM樹時運行給定的函數。 看來這是Backbone.View.extend
函數正常工作的必要條件。
要將CoffeeScript和jQuery一起用於應用程序腳本,請將代碼放在以下模板中:
$ = jQuery
$ ->
MyView = Backbone.View.extend
events:
"click": "testHandler"
testHandler: ->
console.log "click handled"
false
view = new MyView el: $('#test_container')
view.render()
嘗試使用CoffeeScript類聲明語法,例如:
class BacklogView extends Backbone.View
constructor: (@el) ->
this.delegateEvents this.events
events:
"click" : "addStory"
# callbacks
addStory: ->
console.log 'it works!'
當視圖或至少view.el是動態生成時會發生什么? 您可以調用view.delegateEvents()方法來手動設置事件處理程序。
這里有類似的coffeescript,用於在ParentView中呈現ChildView,然后委托childView的事件。
window.ParentView = Backbone.View.extend
addOne: (thing) ->
view = new ChildView({model: thing})
this.el.append view.render().el
view.delegateEvents()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.