0

私の読書によると、Model などの Backbone.js クラスを拡張する場合、かなり一般的なパターンは、次のようにコンストラクターで _.bindAll を呼び出すことです ( https://raw.github.com/eschwartz/backbone.googlemaps/を参照)。 master/lib/backbone.googlemaps.js ):

GoogleMaps.Location = Backbone.Model.extend({
  constructor: function() {
    _.bindAll(this, 'select', 'deselect', 'toggleSelect', 'getLatLng', 'getLatlng');
    // etcetera

これが行われる理由は理解できますが、メソッド名を _.bindAll に明示的に渡す必要があるのはメンテナンス上の問題のようです。新しいメソッドを追加する場合は、それらを _.bindAll にも引数として追加することを覚えておく必要があります。

今日の初めに、これに対するやや冗長な解決策をここに投稿しました: https://stackoverflow.com/a/17977852/34806

しかし、次の単純な手法を使用すると、_.bindAll を呼び出す必要がまったくなくなるのではないでしょうか? つまり、「カスタム」メソッドを割り当てる慣習的な方法の代わりに、代わりにコンストラクター内の「this」にすべてをアタッチします。

constructor: function() {
    this.foo = function() {};
    this.bar = function() {};
}

この手法の欠点はありますか?

4

2 に答える 2

1

あなたのテクニックは機能しません。これらのメソッドを他のメソッドと同じようにバインドする必要があります。または、次のようなものを使用しますvar this = selfが、これらのメソッドはサブクラスやその他の場所では使用できません。

bindAll を完全に取り除き、bind必要なときにちょうど間に合うようにします。たとえば、メソッドをコールバックとしてどこかに渡すときなどです。雑用がローカライズされているため、メンテナンスがはるかに簡単になるはずです。メソッドをコールバックとして渡すときに bind を忘れると、最終的にはvar.

于 2013-07-31T20:38:46.950 に答える
0

バインドしたい_BindAllにメソッドの名前を明示的に渡す必要があるこれは、実際には underscore.js 1.5.0 - 7/6/13 の時点でかなり最近の変更です。そのリリースの変更ログを見ると、その変更について次の理由が表示されます

メソッド名の引数なしで _.bindAll を呼び出す機能を削除しました。バインドしたいメソッドの名前をホワイトリストに登録する方が賢明です。

とはいえ、 Esailjaが言うように、バインディングをよりローカライズしたままにするオプションの 3 番目のパラメーターを利用して、ジャストイン タイムにバインドする方がおそらく良いでしょう。

于 2013-07-31T21:17:31.410 に答える