2012-04-30 20 views
48

Próbuję dowiedzieć się, jak utworzyć kolekcję kolekcji z backbone.js. Jestem całkiem nowy w kręgosłupie. Mam coś podobnego do następującej sytuacji:Kolekcja kolekcji Backbone.js

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

W kodzie wygląda to mniej więcej tak:

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

Jednak zawsze komunikat o błędzie w konsoli js mówiąc:

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

kiedy Próbuję uruchomić funkcję, która wyzwala sprawdzanie poprawności (np. Dodawanie, pobieranie, ...)

It m nie ma różnicy, jeśli dodaję funkcję validate lub _validate do dowolnej kolekcji lub modelu.

Uważam, że tak jest, ponieważ backbone.js nie obsługuje kolekcji w kolekcjach. Czy istnieje inny sposób, który działa?

UPDATE:

Jak to wygląda teraz

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

Wygląda docs szkieletowe obejmują obecnie rozdział poświęcony zagnieżdżonych modeli i kolekcji, bardzo podobnej do przykładu tutaj: http://backbonejs.org/#FAQ-nested –

+0

pierwsze - Cieszę się rozwiązać problem. Mam nadzieję, że będzie to odpowiedź dla niektórych innych, ale twój problem wynika z błędnie zdefiniowanego modelu danych - nie ma "list odtwarzania" (masz po prostu wiele obiektów listy odtwarzania, które są zgrupowane w jednym miejscu), twoje dane zawierają tylko "listę odtwarzania" i " track ", a playlista relacji 1 może mieć wiele ścieżek. W twoim prostym (rozwiązanym) przykładzie ten wzór jest wyraźnie widoczny. – Dainius

Odpowiedz

30

Można by rozwiązać problem poprzez obrót swoimi Playlist z kolekcji w modelu. Jeśli się nad tym zastanowisz, to prawdopodobnie ima inne atrybuty (na przykład nazwę), których nie można ustawić w kolekcji.

Playlists byłaby wówczas kolekcją modeli Playlist (zamiast kolekcji), które powinny działać bezbłędnie.

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

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

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

Dziękuję, wydaje się doskonale działa: D Jednak potrzebowałem kolekcję uzupełniają, ponieważ może mieć wiele odtwarzania utworów: var Tor = Backbone.Model.extend ({ // trackdata }); var Tracks = Backbone.Collection.extend ({ model: Track; }); var Playlist = Backbone.Model.extend ({ model: Utwory }); Listy odtwarzania = Backbone.Collection.extend ({ adres URL: "listy odtwarzania", model: Playlista }); Mam nadzieję, że wszystko będzie działać bez problemów z synchronizacją z serwerem. – krial

+0

Nie jestem pewien, czy to podejście zadziała - po prostu nie możesz ustawić rozszerzenia 'Backbone.Collection' (inaczej' Tracks') jako modelu innej kolekcji. Nadal będziesz chciał zachować 'Track' jako swój' Playlist.model' i nadal możesz używać kolekcji 'Tracks', aby ułatwić synchronizację. –

+0

Zaktualizowałem kod w pytaniu. Nie ustawiłem kolekcji jako modelu innej kolekcji. Ustawię colelction (Tracks) jako atrybut modelu Playlist (extends model). Gdybym zrobił to tak, jak powiedziałeś w odpowiedzi: 'Playlist-> model: track', mogę przechowywać tylko jeden utwór na liście odtwarzania, ponieważ Playlista rozszerza Model, a Model nie ma metod tworzenia zbioru atrybutów Model ... Czy ja się mylę? – krial

Powiązane problemy