我已经看到了从集合中获取下一个或上一个模型的几种不同方法,但是想知道是否有人可以就我决定实施它的方式提供一些建议。我的收藏是有序的,但我正在排序的ID不能保证顺序。它只保证是独一无二的。假设较小的id是集合的“较旧”条目,较大的id是“较新的”。
MyCollection = Backbone.Collection.extend({
model: MyModel,
initialize:function (){
this.getElement = this._getElement(0);
},
comparator: function(model) {
return model.get("id");
},
_getElement: function (index){
var self = this;
return function (what){
if (what === "next"){
if (index+1 >= self.length) return null;
return self.at(++index);
}
if (what === "prev"){
if (index-1 < 0 ) return null;
return self.at(--index);
}
// what doesn't equal anything useful
return null;
};
}
});
使用getElement时,我会执行getElement(“next”)和getElement(“prev”)之类的事情来询问我的集合中的下一个或上一个模型。从getElement返回的是实际模型,而不是索引。我知道collection.indexOf,但我想要一种方法来循环一个集合,而无需先从模型开始。这种实施是否比它需要的更难?
答案 0 :(得分:24)
我会做这样的事情。请记住,目前没有任何错误处理,因此如果您当前处于集合中的第一个模型并尝试获取之前的错误,则可能会出错。
MyCollection = Backbone.Collection.extend({
model: MyModel,
initialize:function (){
this.bindAll(this);
this.setElement(this.at(0));
},
comparator: function(model) {
return model.get("id");
},
getElement: function() {
return this.currentElement;
},
setElement: function(model) {
this.currentElement = model;
},
next: function (){
this.setElement(this.at(this.indexOf(this.getElement()) + 1));
return this;
},
prev: function() {
this.setElement(this.at(this.indexOf(this.getElement()) - 1));
return this;
}
});
进入下一个模型collection.next()
。要进入下一个模型并将其返回var m = collection.next().getElement();
更好地解释下一个/上一个的工作方式。
// The current model
this.getElement();
// Index of the current model in the collection
this.indexOf(this.getElement())
// Get the model either one before or one after where the current model is in the collection
this.at(this.indexOf(this.getElement()) + 1)
// Set the new model as the current model
this.setElement(this.at(this.indexOf(this.getElement()) + 1));
答案 1 :(得分:6)
我之所以这样做的方式略有不同,因为我将方法添加到模型而不是集合中。这样,我可以抓住任何模型,然后按顺序获取下一个模型。
next: function () {
if (this.collection) {
return this.collection.at(this.collection.indexOf(this) + 1);
}
},
prev: function () {
if (this.collection) {
return this.collection.at(this.collection.indexOf(this) - 1);
}
},
答案 2 :(得分:2)
使用更通用的解决方案来破坏这个旧线程:
要添加到Collection.prototype
的资料current: null,
initialize: function(){
this.setCurrent(0);
// whatever else you want to do here...
},
setCurrent: function(index){
// ensure the requested index exists
if ( index > -1 && index < this.size() )
this.current = this.at(index);
else
// handle error...
},
// unnecessary, but if you want sugar...
prev: function() {
this.setCurrent(this.at(this.current) -1);
},
next: function() {
this.setCurrent(this.at(this.current) +1);
}
然后你可以使用糖方法来获得上一个/下一个模型......
collection.prev();
collection.next();
答案 3 :(得分:0)
My Backbone SelectableCollection类:
Backbone.Collection.extend({
selectNext: function () {
if(this.cursor < this.length - 1) {
this.cursor++;
this.selected = this.at(this.cursor);
this.trigger('selected', this.selected);
}
},
selectPrevious: function () {
if(this.cursor > 0) {
this.cursor--;
this.selected = this.at(this.cursor);
this.trigger('selected', this.selected);
}
},
selectById: function (id) {
this.selected = this.get(id);
this.cursor = this.indexOf(this.selected);
this.trigger('selected', this.selected);
},
unselect: function () {
this.cursor = null;
this.selected = null;
this.trigger('selected', null);
}
});