Получение индексной позиции элемента, добавленного в коллекцию Backbone.js.

Если я добавляю элемент в коллекцию, как я могу найти позицию, в которой он был добавлен? Документация Underscore.js для добавления предлагает единственный способ добиться этого — привязать к событию добавления.

Есть ли другой способ? Если нет, то как я могу получить индекс из моего обратного вызова? Я попытался предоставить обратный вызов :

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, поэтому два объекта с одним и тем же ключом фактически являются одним и тем же объектом с точки зрения функции сравнения.

Я надеялся*, что CID будет использоваться, чтобы гарантировать, что объект действительно является тем объектом, который я ищу в уже отсортированной коллекции. Однако кажется, что нет. Я предполагаю, что одно из возможных решений состоит в том, чтобы изменить мою функцию сравнения, чтобы включить CID:

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

Модели остаются отсортированными в соответствии с их значением key, но следующий код возвращает правильную позицию индекса:

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

Чувствуется хакерство :(Кто-нибудь может предложить свое мнение по этому поводу?

10
задан Jack 16 April 2012 в 18:08
поделиться