0

私はいくつかのバックボーンコレクションを使用していますが、いくつかの基準に基づいてそれらの一部にアクセスする必要がある場合があります。

方法1

この質問ですでに述べたようfilter()に、コレクション自体で使用すると、モデルの配列が返され、別のコレクションは返されません。これは単純な場合に機能しますが、モデルのプレーン配列にはコレクションで定義されたすべてのメソッドがないため、コレクションのメソッド連結が失われるという効果があります。

方法2

その質問への答えは、モデルの配列をコンストラクターに渡す新しいコレクションを作成することを提案しました。これは機能しますが、コレクションのコンストラクターを毎回呼び出すという副作用があるため、コレクションをフィルター処理するたびに、そこで定義されている可能性のあるイベントバインディングがスタックされます。

では、いくつかのフィルター基準に基づいてサブコレクションを作成する正しい方法は何ですか?

メソッドチェーンに依存する代わりに、メソッド1を使用して、より多くのフィルタリングメソッドを作成する必要がありますか?

メソッド2を使用して、コレクションのコンストラクターでイベントをバインドしないようにする必要がありますか?

4

2 に答える 2

1

個人的には、コレクション内にロジックをカプセル化するという追加の利点があるため、コレクションに対してより多くのフィルタリングメソッドを作成します。

既存のコレクションを再利用することもできます。私はそのアイデアをいじくり回していて、次のようなものにたどり着きました。

var Collection = Backbone.Collection.extend({
  //Takes in n arrays. The first item of each array is the method you want
  //to call and the rest are the arguments to that method. 
  //Sets the collection.models property to the value of each successive filter
  //and returns the result of the last. Revers the collection.models to its original value.
  chainFilters: function(/*args..*/) {
    var models = this.models;
    try {
      filters = _.toArray(arguments);
      _.each(filters, function(filter) {
         this.models = filter[0].apply(this, _.rest(filter));
      }, this);
    } catch(err) {
      this.models = models;
      throw err;
    }

    var filtered = this.models;
    this.models = models;
    return filtered;   
  }
});

使用法:

var results = collection.chainFilters(
  [ collection.filter, function(model) { return model.get('name') === 'foo'; } ],
  [ collection.someMethod, 'someargument' ],
  [ collection.someOtherMethod ]
);

これが実用的なサンプルです。それは少し独特です、私は知っています。

于 2013-01-07T17:51:14.363 に答える
0

ユースケースによって異なります。これらのモデルでビューを更新する場合は、新しいコレクションが必要になる可能性があります。そうしないと、リアクティブなテンプレートの更新がうまくいきません。データの更新を気にせずにモデルでデータを反復処理または操作したいだけの場合は、配列+underscore.jsを使用します。

配列で試してみてください。underscore.jsにはない機能を備えたボイラープレートコードをたくさん書いている場合は、コレクションの使用を開始してください。

于 2013-01-07T15:37:56.710 に答える