He visto algunas maneras diferentes de obtener el modelo siguiente o anterior de una colección, pero me preguntaba si alguien podría ofrecerme algún consejo sobre la forma en que decidí implementarlo. Mi colección está ordenada, pero la identificación que estoy ordenando no garantiza que sea secuencial. Solo se garantiza que es único. Supongamos que los ID más pequeños son entradas "más antiguas" para la colección y los ID más grandes son "más nuevos".Obteniendo el modelo siguiente y anterior de una colección
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;
};
}
});
Al utilizar getElement, hago cosas como getElement ("siguiente") y getElement ("Anterior") para pedir el modelo anterior o siguiente en mi colección. Lo que se devuelve de getElement es el modelo real, no el índice. Conozco collection.indexOf, pero quería una forma de recorrer una colección sin tener primero un modelo para empezar. ¿Es esta implementación más difícil de lo que necesita ser?
me gustan algunas de sus ideas, especialmente al usar this.at() en el método de inicialización. Sin embargo, su código es bastante extenso. Si nadie más sugiere algo mejor y/o más conciso, obtendrá la verificación verde :-) Mi método es más corto y evita caerse al final de la colección devolviendo nulo cuando llegue a cualquiera de los extremos. –
Puede acortarlo abandonando las funciones 'set/getElement' y simplemente accediendo directamente al valor' currentElement'. – abraham
Si usa v0.9 +, necesitará tener this.setElement (this.at (0)); eso está actualmente en la función de inicialización llamada después de crear la colección. Esto se debe a que se llama a initialize antes de que Collection cree los modelos. por ejemplo, var myCollection = new MyCollection (data); myCollection.setElement (this.at (0)); –