私はbackbone.jsを学び、ついにいくつかのコードをまとめました。ここではすべてがいじくり回されています。
問題は正確には、と思いますevents
。のビュー機能をトリガーしていませんclick
。
それを機能させる方法は?「落とし穴」がありませんか?
私はbackbone.jsを学び、ついにいくつかのコードをまとめました。ここではすべてがいじくり回されています。
問題は正確には、と思いますevents
。のビュー機能をトリガーしていませんclick
。
それを機能させる方法は?「落とし穴」がありませんか?
ビューは、バインドされている DOM 要素から発生するイベントをリッスンします。
ビューをどの要素にもバインドしていません。これは、ビューの要素がdiv
実際にはどこにも配置されていない空であることを意味します。そのため、イベントがビューに到達することはありません。あなたがする必要があるのは、ボタンから来るイベントを聞く要素にビューをバインドすることです。
el
ボタンを含むようにビューを設定してください。
追加のクレジットと物事をより面白くするために:-)、実際にはel
、イベントを適切に委任するために Backbone.View を明確に定義する必要はありません。たとえば、次のようにします。
MyView = Backbone.View.extend({
// The events to delegate
events: {
'click #test':'onClick'
},
initialize: function() {
// delegateEvents() actually happens in constructor, before render()
// At this point there is no #test
},
render: function() {
// By default, el is an empty div
this.$el.html('<button id="test">testButton</button>');
return this;
},
onClick: function(event) {
console.log('clicked');
}
});
view = new MyView();
$('body').append(view.render().el); // We append this view to end of body
前のコードでは、(明示的に) を定義していませんでしたel
。覚えておくべき最も重要なことは、明示的なel
. むしろ、それは@jakeeがここで言っていることです:
ビューは、バインドされている DOM 要素から発生するイベントをリッスンします。
ビュー内で渡すか定義するイベント ハッシュは、ビュー内でリッスンされます。それが定義済みの div であるel
か一般的な div であるかに関係なく、その中のものをリッスンし、イベント ハンドラーをデリゲートするため、ハンドラーはthis
ビューをポイントし続けます。良い。
次のようなことをした場合:
$('#test').remove();
$('body').prepend('<button id="test">Second Test</button>');
#test がビューの外にあることがわかります (ボディの最後に追加された一般的な el です。クリックしても何も起こりません。しかし、最もクールなのはこれです。
$('#test').remove();
$('div:last').html('<button id="test">Third Test</button>');
このコードでは、本文の上部にある #test を削除し、ビューに再度追加しました。それをクリックすると、その機能が再開されonClick()
ます。
el
プロパティを設定してビューのコンテナを定義する必要があります。その後、期待どおりに機能します。
Backbone.View.extend({
el: "body",
events: {
"click #add-contact": "addContact",
"click #test": "alertMe"
},
更新されたフィドル: http://jsfiddle.net/fAB28/1/