10

コレクションにアイテムを追加した場合、追加された位置を見つけるにはどうすればよいですか?addに関するUnderscore.jsのドキュメントでは、これを実現する唯一の方法は、addイベントにバインドすることであると示唆しています。

他に方法はありますか?そうでない場合、コールバックからインデックスを取得するにはどうすればよいですか?私は次のコールバックを提供しようとしました:

foo:function(model, options) {
  console.log("foo: " + options.index);
},

しかし、options.indexはundefinedです。私はこのコードでイベントにバインドします:

this.collection.bind('add', this.foo);

次のコードでアイテムを追加します。

this.collection.add(myNewItem);

コレクションのモデルは次のとおりです。

MyModel = Backbone.Model.extend({
defaults : {
   key:undefined,
   myObj:undefined,
},

コレクションは次のとおりです。

MyModel List = Backbone.Collection.extend({
      model: MyModel,

initialize: function() {
   this.comparator = function(aModel) {
   return aModel.get('key'); 
  };
 }});

私はモデルをコレクションに追加しています:

 var key = "always_the_same";
var mm = new MyModel({key:key});
this.collection.add(mm);
var index = this.collection.sortedIndex(mm , this.collection.comparator));

アップデート

問題は(私が思うに)、コンパレータ関数がindexOfとsortedIndexOfに使用されるため、コンパレータ関数に関する限り、同じキーを持つ2つのオブジェクトは事実上同じオブジェクトです。

私は、CIDを使用して、オブジェクトが実際に既にソートされたコレクションで探しているオブジェクトであることを確認することを望んでいました*。しかしそうではないようです。考えられる解決策の1つは、コンパレータ関数を変更してCIDを含めることだと思います。

initialize: function() {
        this.comparator = function(aModel) {
          return aModel.get('key') + aModel.cid; 
        };
      },

モデルは値に従って並べ替えられたままkeyですが、次のコードは正しいインデックス位置を返します。

this.collection.sortedIndex(myModel, this.collection.comparator);

ハッキーだと感じます:(誰かがこれについて意見を述べることができますか?

4

2 に答える 2

18

メソッドを使用してモデルをコレクションに追加する単純なシナリオを扱っている場合は、追加後にそのモデルでメソッドaddを呼び出すだけで済みます。indexOf

var myModel = new MyModel({some: "data"});

var myCollection = new MyCollection();
myCollection.add(myModel);

var index = myCollection.indexOf(myModel);
于 2012-04-15T14:27:51.097 に答える
1

更新しました

アンダースコアのあるコレクション内の要素の「インデックス」を知りたい場合は、 を使用できますindexOf

あなたが何をしたいのかをよりよく理解できるように、コードのより大きなサンプルをフィドルに追加していただけますか? たとえば、コレクション内の要素がプリミティブ型ではない場合 (int または String ではなく JavaScript オブジェクト) indexOf、異なる参照である同じ値を持つオブジェクトは によって等しいと見なされないため、問題が発生する可能性があるためですindexOf

更新 2

これを試すことができます:

var cids = this.collection.map(function(elem){ return elem.cid; });
var index = _(cids).indexOf(myModel.cid);
于 2012-04-15T10:42:30.453 に答える