如果我将一个项目添加到集合中,我如何找到它被添加的位置?用于 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,因此就比较器函数而言,具有相同键的两个对象实际上是同一个对象。
我曾希望* CID 将用于确保对象实际上是我在已经排序的集合中寻找的对象。然而似乎不是。我想一种可能的解决方案是更改我的比较器函数以包含 CID:
initialize: function() {
this.comparator = function(aModel) {
return aModel.get('key') + aModel.cid;
};
},
模型仍然根据它们的key
值排序,但以下代码返回正确的索引位置:
this.collection.sortedIndex(myModel, this.collection.comparator);
感觉 hacky :( 任何人都可以对此发表意见吗?