2011-06-20 21 views
25
Código

muestra:Filtrado de una colección Backbone devuelve una matriz de modelos

this.books = this.getBooksFromDatabase(); 
this.publishedBooks = this.books.filter(function(book) { 
    return book.get("isPublished") === "1"; 
}); 

Aquí está el problema:

this.books.filter, devuelve una matriz de los modelos. He intentado envolver la matriz, tales como:

var publishedBooks = _(this.books.filter(function(book) { 
    return book.get("isPublished") === "1"; 
})) 

según lo recomendado por este post: https://github.com/documentcloud/backbone/issues/120

pero todavía no se puede ejecutar cosas como: publishedBooks.each (...), o publishedBooks.get (...)

¿Qué me falta? ¿Hay alguna manera de convertir la matriz devuelta en una colección?

Respuesta

34

Puede instanciar una nueva colección de red troncal y pasarla a la matriz.

var myPublishedBooks = new MyBooksCollection(publishedBooks); 

O podría actualizar su colección original.

this.books.refresh(publishedBooks) 

Nota que el 0.5.0 release in July 2011 renombró refresh a reset, por lo que se puede lograr esto en las versiones más recientes de la espina dorsal con;

this.books.reset(publishedBooks) 
+12

La renovación de la colección se renombró para restablecer la colección http://documentcloud.github.com/backbone/#Collection-reset –

4
var collection = new Backbone.collection(yourArray) 
+0

Esto solo funciona para la colección Backbone "vainilla". Incluso con Custom Collection uno necesitaría codificar su definición. La solución anterior con reinicio evita eso. –

3

hago a menudo algo como esto:

var collection = new MySpecialCollection([...]); 
//And later... 
var subset = new collection.constructor(collection.filter(...)); 

Esto creará una instancia del mismo tipo que la colección original, con los modelos filtrados, para que pueda continuar con la colección métodos (cada uno, filtro, buscar, arrancar, etc.).

Cuestiones relacionadas