Если я добавляю элемент в коллекцию, как я могу найти позицию, в которой он был добавлен? Документация 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);
Чувствуется хакерство :(Кто-нибудь может предложить свое мнение по этому поводу?