2011-10-18 55 views
5

有人可以告訴我爲什麼以下不起作用請。我期待警告射擊,當我點擊鏈接backbone.js簡單視圖事件不能觸發

<body> 
    <a class="newnote" href="#">Add new note</a> 
</body> 

<script> 
var note = Backbone.Model.extend({}); 

var notes = Backbone.Collection.extend({ 
    model: note, 
    url: '<?= $this->createUrl('/filenotes/api'); ?>' 
}); 

var note_view = Backbone.View.extend({ 
    el: 'table', 

}); 

var Appview = Backbone.View.extend({ 
    el: $('body'), 

    events: { 
     "a click" : "showForm" 
    }, 
    initialize: function(){ 
     //alert('hi'); 
    }, 
    showForm: function(){ 
     alert('hi'); 
    } 
}); 

var v = new Appview(); 
</script> 

這裏有http://jsfiddle.net/neilcharlton/yj5Pz/1/

回答

19

$("body")選擇在你的DOM被加載之前就開始了,所以它會返回空的並且不會綁定到鏈接上。

骨幹對象定義是使用對象文字定義的,這意味着它們會在定義時立即進行評估,而不是在實例化模型時進行評估。

此:

Backbone.View.extend({foo: "bar"}) 

在功能上是一樣的:

var config = {foo: "bar"}; 
Backbone.View.extend(config); 

既然你有一個$("body")選擇爲el值,它就會盡快查看配置解析評價,這意味着DOM尚未加載並且不會返回任何內容。

解決此問題的方法有很多...所有這些選項都會延遲選擇器的評估,直到DOM加載完成。

我個人最喜歡的是選擇在實例傳遞給視圖中,DOM加載後:

var AppView = Backbone.View.extend({ 
    // don't specify el here 
}); 

$(function(){ 
    // after the DOM has loaded, select it and send it to the view 
    new AppView({ el: $("body") }); 
} 

也 - 樣斯凱勒說,被宣佈爲您的活動是錯誤的。

這裏有一個工作的jsfiddle:http://jsfiddle.net/yj5Pz/5/

+0

感謝您的額外信息。 – 32423hjh32423

+1

更好的是依靠這樣一個事實:Backbone會在時間自動包裝你的'el':'{el:'body',...}',現在'this。$ el'將會是jQuery元素你正在尋找。 – rfunduk

+0

+1 rfunduk - 新的v0.9骨幹系列使得處理更容易。現在不需要手動將你的el包裝在jquery選擇器中,因爲骨幹網爲我們做了 –

9

對於先發球員的jsfiddle,事件對象是這樣的語法:

events: { 
    "click a" : "showForm" 
}, 
1

除了德里克的回答,照顧約DOM元素的範圍,我試圖觸發元素上簡單的點擊事件,但我View.el被引用的非直接父,那麼它出於某種原因(也許是一個遞歸錯誤)不起作用。當我將el更改爲「body」css選擇器時,一切都很順利。