2012-04-30 19 views
48

Sto cercando di capire come creare una raccolta di raccolte con backbone.js. Sono abbastanza nuovo per la spina dorsale. Ho qualcosa di simile la seguente situazione:Backbone.js Raccolta di collezioni

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

In codice di questo è simile a questo:

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 
}); 

Tuttavia ricevo sempre un errore nella console js dicendo:

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

quando Provo ad eseguire una funzione che attiva il validate (come add, fetch, ...)

It m non fa differenza se aggiungo la funzione validate o _validate a una qualsiasi delle collezioni o dei modelli.

Credo che questo sia dovuto al fatto che backbone.js non supporta le raccolte nelle raccolte. C'è un altro modo in cui funziona?

UPDATE:

Questo è come appare in questo 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

Sembra che la documentazione backbone includono ora una sezione sui modelli e collezioni annidate, molto simili all'esempio qui: http://backbonejs.org/#FAQ-nested –

+0

In primo luogo - contento che hai risolto il tuo problema. Speriamo che questa sia la risposta per alcuni altri, ma il tuo problema arriva dal modello di dati che definisce erroneamente - non ci sono "playlist" (hai solo molti oggetti playlist, raggruppati in un'unica posizione), i tuoi dati contengono solo "playlist" e " traccia ", e c'è una playlist di relazione 1 può avere molte tracce. Nel tuo semplice esempio (risolto) questo modello è visibile abbastanza chiaro. – Dainius

risposta

30

Faresti risolvere il problema trasformando il Playlist da una raccolta in un modello. Se ci pensate, uno Playlist probabilmente avrebbe comunque altri attributi (ad es. Nome) che non sarebbero impostabili su una collezione.

Playlists sarebbe quindi una raccolta di modelli Playlist (invece di raccolte), che dovrebbe funzionare senza errori.

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

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

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

Grazie, sembra funzionare perfettamente: D Tuttavia ho bisogno di una collezione di integratore, perché un elenco di riproduzione può avere più tracce: var = Traccia Backbone.Model.extend ({// TrackData }); var Tracks = Backbone.Collection.extend ({ modello: Track; }); var Playlist = Backbone.Model.extend ({ model: Tracks }); var Playlist = Backbone.Collection.extend ({ url: "playlist", modello: playlist }); Spero che tutto funzioni senza problemi con la sincronizzazione con un server. – krial

+0

Non sono sicuro che l'approccio funzionerà, semplicemente non è possibile impostare un'estensione di 'Backbone.Collection' (ad esempio' Tracks') come modello di un'altra raccolta. Continuerai a voler mantenere 'Track' come' Playlist.model', e puoi comunque utilizzare una raccolta 'Tracks' per facilitare la sincronizzazione, comunque. –

+0

Ho aggiornato il codice nella domanda. Non ho impostato una raccolta come modello di un'altra raccolta. Ho impostato la colelction (Tracks) come attributo del modello Playlist (estende il modello). Se l'avessi fatto come hai detto nella risposta: 'Playlist-> model: track', potrei memorizzare solo una traccia all'interno della playlist, perché la Playlist estende Model e un Model non ha metodi per creare una collezione dell'attributo Model ... O mi sbaglio? – krial

Problemi correlati