Tentando resolver o problema do carregamento lento de um modelo de uma coleção. O problema: você não pode depender do método get retornando o modelo se a coleção ainda não tiver o modelo. Por outro lado, usar o método fetch irá buscá-lo no servidor, mesmo se a coleção já tiver o modelo. Portanto, esta é minha solução: adicionar um método fetchOne.
Catalog.Categories.Collection = Backbone.Collection.extend({
fetchOne : function (id, success) {
var result = this.get(id);
if (typeof result !== 'undefined') {
success.apply(result);
return result;
}
var where = {};
where[this.model.prototype.idAttribute] = id;
var model = new this.model(where);
this.add(model);
model.fetch({success: function () {
success.apply(model);
}});
return model;
}
};
Chamando de seu código:
collection.fetchOne(123, function () {console.log(this)});
Chega de adivinhar se o modelo já está na coleção !. No entanto, você deve usar um retorno de chamada, pois não pode depender de um resultado intimidador. Você pode usar async false para contornar essa limitação.