2011-10-18 5 views

答えて

19

あなた$("body")セレクタDOMがロードされる前に起動しているので、空に戻り、リンクにバインドされることはありません。

バックボーンオブジェクト定義はオブジェクトリテラルで定義されています。つまり、モデルのインスタンス化時ではなく、定義時にすぐに評価されます。

この:

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

は、機能的にこれと同じです:

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

あなたはelの値として$("body")セレクタを持っているので、それはできるだけ早くビューの設定が解析されるように評価されます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") }); 
} 

- Skylarが言ったように、あなたのイベントが間違って宣言されました。ここで

は作業JSFiddleです:Derickの回答に加えて、DOM要素の範囲についての世話をする、私は、要素上の簡単なクリックイベントをトリガしようとしていたが、私のView.elは非直接の親を参照して http://jsfiddle.net/yj5Pz/5/

+0

おかげさまで、ありがとうございました。 – 32423hjh32423

+1

Backboneは、 'el:' body '、...} 'の時に、' el .'をjQueryで自動ラップするという事実に頼ることになります。あなたが探していたjQuery要素。 – rfunduk

+0

+1 rfunduk - 新しいv0.9シリーズのバックボーンにより、これを扱いやすくなりました。バックボーンは私たちのために、jqueryセレクターで手動でエルをラップする必要はありません –

9

ありリンクに

<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> 

をクリックすると、イベントオブジェクトを火にアラートを期待しています。この構文は次のとおりです。

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

何らかの理由で(再帰バグかもしれない)、うまくいきませんでした。私がelを "body" cssセレクタに変更したとき、すべてがうまくいった。

関連する問題