initialize作業を妨げている 2 つの問題があります。
printText対象外です。
_.bindそして_.bindAll違う振る舞いをします。
this.printText最初のものは修正が簡単で、 だけでなくを使用したいprintText。
_.bind単一の関数を a にバインドし、そのバインドされた関数thisを返します。_.bindAll一方、 は、いくつかの名前付き関数を にthisバインドし、バインドされた関数を指定された にアタッチしたままにしますthis。したがって、これを行う:
_.bind(printText, this);
バインドされた関数を破棄しているため、何も役に立ちません。あなたはこれをしたいでしょう:
this.printText = _.bind(this.printText, this);
または、より一般的にバックボーン アプリでは、次を使用します_.bindAll。
_.bindAll(this, 'printText');
これで機能が整い、内部initializeが正しくなり、修正に進むことができます。クリックされた からテキストを抽出したいと思います。あなたはこのようにこれを行うことができます:thisprintTextprintText<li>
printText: function(ev) {
console.log($(ev.target).text());
}
しかし、それはまだ機能せず、ここで何が起こっているのか疑問に思っています. バックボーンはイベントをビューにバインドするelので、それを見てみましょう:
var print = Backbone.View.extend({
el : $('ul li.newItem'),
//...
それがBackbone.View.extend実行されると、DOM に要素がなくなるため、そのビューでli.newItemは役に立ちません。elここでの通常のアプローチは、次のようなビューを持つことです。
var Print = Backbone.View.extend({
tagName: 'li',
events: {
'click': 'printText'
},
render: function() {
this.$el.text('Hello world ' + this.options.i);
return this;
},
printText: function(e){
console.log($(e.target).text());
}
});
に設定tagNameし'li'、Backbone<li>自体に を作成させます。次に、カウンタの値をPrint引数としてビューに渡します。Backbone は、this.options.iと言うときに引数をそのまま残しますnew Print({ i: ... })。
addItem次に、メソッドを調整して、ListView新しい を作成Printし、それらを に追加する必要があり<ul>ます。
addItem: function(){
this.counter++;
var v = new Print({ i: this.counter });
this.$('ul').append(v.render().el);
}
更新されたデモ: http://jsbin.com/evoqef/10/edit
他にもいくつか変更を加えました。
this.$elの代わりに使用$(this.el)します。すでに利用可能なものを作成する必要はありません。
this.$()の代わりに使用すると$('ul', this.el)、同じ結果になりますが、関数呼び出しthis.$()の最後にコンテキストが隠されず、バックボーンではより慣用的です。$()this.$()