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
が正しくなり、修正に進むことができます。クリックされた からテキストを抽出したいと思います。あなたはこのようにこれを行うことができます:this
printText
printText
<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.$()