Ho visto alcuni modi diversi per ottenere il modello successivo o precedente da una raccolta, ma mi chiedevo se qualcuno potesse offrire qualche consiglio sul modo in cui ho deciso di implementarlo. La mia collezione è ordinata, ma l'id che sto ordinando non è garantito per essere sequenziale. È garantito che sia unico. Supponiamo che gli id più piccoli siano voci "più vecchie" della collezione e gli ID più grandi siano "più recenti".ottenere il modello successivo e precedente da una collezione
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;
};
}
});
Quando si utilizza getElement, faccio cose come getElement ("next") e getElement ("prev") per chiedere per il modello successivo o precedente nella mia collezione. Ciò che viene restituito da getElement è il modello attuale, non l'indice. Conosco collection.indexOf, ma volevo un modo per scorrere una collezione senza prima avere un modello da cui partire. Questa implementazione è più difficile di quanto dovrebbe essere?
mi piacciono alcune delle tue idee, in particolare utilizzando this.at() nel metodo di inizializzazione. Tuttavia, il tuo codice è piuttosto lungo. Se nessun altro suggerisce qualcosa di meglio e/o più conciso, otterrai il controllo verde :-) Il mio metodo è più corto e impedisce di cadere dalla fine della raccolta restituendo null quando arrivi a una delle due estremità. –
È possibile accorciarlo abbandonando le funzioni 'set/getElement' e semplicemente accedendo direttamente al valore' currentElement'. – abraham
Se si utilizza v0.9 + è necessario avere this.setElement (this.at (0)); che è attualmente nella funzione di inizializzazione chiamata dopo aver creato la raccolta. Questo perché inizializza viene chiamato prima che la Collezione crei i modelli. ad es .: var myCollection = new MyCollection (data); myCollection.setElement (this.at (0)); –