2012-04-30 23 views
48

Estoy tratando de averiguar cómo hacer una colección de colecciones con backbone.js. Soy bastante nuevo en la columna vertebral. Tengo algo parecido a la siguiente situación:Backbone.js Colección de colecciones

+---------------+    +------------------+ 
| Playlists  |    | Playlist   | 
|---------------|   0..* |------------------| 
|    +-------------->| Name    | 
|    |    |     | 
|    |    |     | 
+---------------+    +-------+----------+ 
             | 
             | 
             |0..* 
             v 
           +------------------+ 
           | Track   | 
           |------------------| 
           | Name    | 
           | Artist   | 
           |     | 
           +------------------+ 

En el código esta es similar a esto:

var trackModel = Backbone.Model.extend({ 
    //trackdata 
}); 

var playlistModel = Backbone.Collection.extend({ 
    model : trackModel, 
    url : "playlist" 
}); 

var playlistsModel = Backbone.Collection.extend({ 
    url : "playlists", 
    model : playlistModel //This pretty sure doesn't work like I want, because there is no model attribute for collections :S 
}); 

Sin embargo siempre recibo un error en la consola JS diciendo:

Uncaught TypeError: Object [object Object] has no method '_validate' 

cuando Intento ejecutar una función que desencadena la validación (como agregar, recuperar, ...)

Es m no hay diferencia si agrego la función validate o _validate a cualquiera de las colecciones o modelos.

Creo que esto se debe a que backbone.js no admite colecciones en colecciones. ¿Hay alguna otra manera que funcione?

ACTUALIZACIÓN:

Esto es como se ve en este momento

var Track = Backbone.Model.extend({ 
    //trackdata 
}); 

var Tracks = Backbone.Collection.extend({ 
    model:Track; 
}); 

var Playlist = Backbone.Model.extend({ 
    //name : ... 
    tracks: new Tracks() 
}); 

var Playlists = Backbone.Collection.extend({ 
    url : "playlists", 
    model : Playlist 
}); 
+0

Parece que la documentación de la columna vertebral incluyen ahora una sección sobre modelos y colecciones anidadas, muy similar a este ejemplo: En primer lugar http://backbonejs.org/#FAQ-nested –

+0

- contenta de que su problema resuelto. Esperemos que esto sea una respuesta para otros, pero su problema proviene de un modelo de datos incorrectamente definido: no hay "listas de reproducción" (solo tiene muchos objetos de lista de reproducción agrupados en un solo lugar), sus datos solo contienen "lista de reproducción" y " pista ", y hay relación 1 lista de reproducción puede tener muchas pistas. En su ejemplo simple (resuelto) este patrón es visible bastante claro. – Dainius

Respuesta

30

Se podría resolver su problema por convertir su Playlist de una colección en un modelo. Si lo piensas, un Playlist probablemente tenga otros atributos de todos modos (por ejemplo, el nombre) que no serían configurables en una colección.

Playlists sería entonces una colección de modelos Playlist (en lugar de colecciones), que debería funcionar sin error.

var Track = Backbone.Model.extend({ 
    //trackdata 
}); 

var Playlist = Backbone.Model.extend({ 
    model : Track 
}); 

var Playlists = Backbone.Collection.extend({ 
    url : "playlists", 
    model : Playlist 
}); 
+0

Gracias, parece que funciona perfectamente: D Sin embargo necesitaba una colección de suplemento, ya que una lista puede contener varias pistas: Pista var = Backbone.Model.extend ({// trackdata }); var Tracks = Backbone.Collection.extend ({ modelo: Track; }); var Lista de reproducción = Backbone.Model.extend ({ modelo: Pistas }); var Listas de reproducción = Backbone.Collection.extend ({ url: "listas de reproducción", modelo: Lista de reproducción }); Espero que todo funcione sin problemas con la sincronización con un servidor. – krial

+0

No estoy seguro de que el enfoque funcione; simplemente no puede establecer una extensión de 'Backbone.Collection' (es decir,' Tracks') como el modelo de otra colección. Aún querrás mantener 'Track' como tu' Playlist.model', y aún puedes usar una colección 'Tracks' para ayudar a facilitar la sincronización. –

+0

He actualizado el código en la pregunta. No configuré una colección como el modelo de otra colección. Establecí colelction (Tracks) como un atributo del modelo Playlist (extiende el modelo). Si lo hubiera hecho como dijo en la respuesta: 'Lista de reproducción-> modelo: pista', solo pude almacenar una pista dentro de la lista de reproducción, porque la lista de reproducción amplía el modelo y un modelo no tiene métodos para hacer una colección del atributo modelo. ... ¿O estoy equivocado? – krial

Cuestiones relacionadas