次の 2 行のコードの長所と短所は何ですか? 同じことをするのに2つの異なる方法がある理由がわかりません。
this.listenTo(app.Todos, 'change:completed', this.filterOne);
app.Todos.on('change:completed', this.filterOne);
また、.on を使用する場合、デフォルトのコンテキストを確認するにはどうすればよいですか?
次の 2 行のコードの長所と短所は何ですか? 同じことをするのに2つの異なる方法がある理由がわかりません。
this.listenTo(app.Todos, 'change:completed', this.filterOne);
app.Todos.on('change:completed', this.filterOne);
また、.on を使用する場合、デフォルトのコンテキストを確認するにはどうすればよいですか?
listenTo
これらのリスナーは自動的に削除されるためstopListening
、ビューが削除されたときに が呼び出されます ( 経由remove()
)。以前listenTo
は、ファントム ビューが永遠にぶらぶらする (メモリ リークや誤動作の原因となる) という非常に陰湿な問題がありました。これは、ビュー インスタンス自体がなくなって DOM に存在しなくなったにもかかわらず、ビュー メソッドがモデルのイベント リスナーとして参照されていたためです。
のバックストーリーを読みたい場合はlistenTo
、バックボーンの github リポジトリを検索してlistenTo
、より長い問題の議論を読んでください。
デフォルトのコンテキストに関しては、いくつかのものがバインドされる可能性がありますthis
:
this.listenTo
、それは常にビュー インスタンスになります (コメントで Wim Leers が指摘)this.listenTo
と話がややこしくなる
foo.on
) を指定すると、バックボーンはそれを使用します (したがって、これはより堅牢なアプローチです)。function () {//your event handler}.bind(this)
、コンテキストを手動で制御することもできます (こちらも推奨)_.bind
または$.proxy
ECMAの代替品が利用可能ですfunction.bind
this.bindAll('onClick', ...)
、ビュー インスタンスがコンテキストになります。this
events
プロパティを使用して接続されたすべてのイベントは、バックボーンによってビュー インスタンスに自動的にバインドされます (これは を使用したベルトとサスペンダーですbindAll
) 。したがって、いくつかのガイドラインに要約すると、次のようになります。
events
簡潔で正しいため、可能な限りプロパティを使用してくださいthis.listenTo
モデルとコレクションへのすべてのバインディングに使用Function.bind
ますが、ここにはいくつかの優れたオプションがあります。