如果我将一个项目添加到Collection中,我如何找到添加它的位置? Underscore.js documentation for add表明实现此目的的唯一方法是绑定到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 :( 任何人都可以对此提出意见吗?
答案 0 :(得分:18)
如果您正在处理使用add
方法将模型添加到集合的简单方案,那么在添加模型后,您只需要使用该模型调用indexOf
方法。 / p>
var myModel = new MyModel({some: "data"});
var myCollection = new MyCollection();
myCollection.add(myModel);
var index = myCollection.indexOf(myModel);
答案 1 :(得分:1)
<强>已更新强>
如果您想知道带有下划线的集合中元素的“索引”,可以使用indexOf
。
你可以在一个小提琴中添加一个更大的代码示例,这样我就能更好地理解你想做什么吗?因为例如,如果集合中的元素不是基本类型(没有整数或字符串而是javascript对象)indexOf
可能会出现问题,因为具有相同值的不同引用的对象不会被{{1 }}
更新2
您可以尝试这样做:
indexOf