2012-06-03 12 views
11

Utknąłem o tym, jak zaprojektować aplikację backbone.js dotyczącą moich relacji z modelami.Jak obsługiwać relacje w backbone.js

Jeśli mam model zdarzeń, który ma kilka relacji, powiedzmy, że model użytkownika może mieć wiele zdarzeń, a model zdarzenia z kolei może mieć wiele komentarzy i udziałów. Użytkownik może mieć wiele komentarzy, a udział może mieć jednego użytkownika i jedno wydarzenie. Wow, co za bałagan!

Event has many Comments 
Event has many Participations 
Event has one User 

User has many Events 
User has many Participations 
User has many Comments 

Comment has one Event 
Comment has one User 

Participation has one User 
Participation has one Event 

Okey, więc moja myśl była załadować listę zdarzeń, gdy użytkownik ładuje stronę, a gdy użytkownik kliknie zdarzenia załadować resztę informacji o tym wydarzeniu (komentarze, udziały i użytkownika) .

Pytanie brzmi, czy powinienem użyć jakiejś globalnej zmiennej do przechowywania wszystkich zdarzeń, użytkowników itd., A kiedy złapię informację z serwera, umieść ją tam (i sprawdź tam zanim złapię coś z serwera) , może w jakimś typie localstorage (i jak mam to zrobić za pomocą backbone-relational?).

Inną ideą, którą miałem, było zezwolenie każdemu wydarzeniu na posiadanie własnych niezależnych danych. Problem polega na tym, że prawdopodobnie wyślę nadmiarowe dane za każdym razem, gdy kliknę wydarzenie.

Jaki sposób polecasz?

dziękuję!

Odpowiedz

0

Teoretycznie można załadować wszystkie oddzielne kolekcje, a następnie użyć lokalnego filtrowania w kolekcjach, aby pobrać odpowiednie modele podczas renderowania.

Oczywiście musisz wziąć pod uwagę kwestie bezpieczeństwa.

Nie było dla mnie jasne, przynajmniej z twojego pytania, co zamierzasz zrobić z informacjami, które złapałeś, ale postaram się odpowiedzieć jak najlepiej.

Zakładam, że masz jakieś Wydarzenia z dodatkowymi danymi i musisz wyświetlić informacje na ten temat. Następnie trzeba także być w stanie robić rzeczy, jak dodawanie komentarzy itp

Jak powiedziałem, można rozważyć wykonanie następujących czynności:

var Events = Backbone.Collection.extend({ 
    url: '/events', // You might want to let the app return only an account's events or something, not just ALL events. 
    initialize: function(){ 
     this.fetch(); 
    } 
}); 

var Comments = Backbone.Collection.extend({ 
    url: '/comments', 
    initialize: function(){ 
     _.bindAll(this, 'getEventComments'); 
     this.fetch(); 
    }, 

    getEventComments: function(event_id){ 
     return _.filter(this.models, function(model){ return model.get('event_id') == event_id; }); 
    } 
}); 
//etc 

Za pomocą funkcji filtrowania podkreślenia mogą Państwo bardzo szybko uzyskać odpowiednie modele za każdym razem, gdy ich potrzebujesz (na przykład przy renderowaniu).

W pewnym sensie jest to to samo, co w skryptach po stronie serwera. Niektóre bazy danych przechowują wszystkie twoje tabele z zapisami, tak jak twoje zbiory będą tutaj robić, a twój kod prosi o bazę danych odpowiednich danych w oparciu o pewne dane wejściowe.

Wreszcie, zawsze będę wskazywać Require.js w połączeniu z kręgosłupem dla ludzi. Bezwstydnie refering odpowiedź dałem dzisiaj, to sprawdzić, to ułatwić życie bez względu na to: Backbone Design

18

Jak @mu_is_too_short skomentował Backbone relacyjne może być coś jesteś zainteresowany patrząc. Dzięki Backbone-relational modele i kolekcje submodel są tworzone automatycznie, a zdarzeniami można zarządzać w relacji rodzic-dziecko.

Po prostu podam ci przykładowy kod, abyś mógł go posmakować. Część przykładowego kodu może wyglądać mniej więcej tak.

Użytkownik ma wiele imprez:

User = Backbone.RelationalModel.extend({ 
    relations: [ 
     type: Backbone.HasMany, // Type of relationship 
     key: 'events',   // How we reference the sub-models in collection 
     relatedModel: 'Event', // The sub-model type 
     collectionType: 'EventCollection', // The sub-model collection 
     reverseRelation: { 
      key: 'belongsToUser'   // Key we use to refer to the parent 
     } 
    ], 
    // Other Backbone.Model properties and functions 
}); 

Podczas tworzenia modelu Backbone-relacyjny, to automatycznie tworzy kolekcję podmodeli dla Ciebie nazwanych „klucza”, który wyznacza. Tak więc każdy użytkownik, który posiadasz, będzie miał uporządkowany zbiór powiązanych ze sobą zdarzeń.

Zasadniczo, po utworzeniu lub pobraniu użytkownika podaje się odniesienia do powiązanych modeli, których potrzebuje. Na przykład Twój identyfikator użytkownika = 1 może wymagać zdarzeń 5, 7 i 11. (używam tylko identyfikatorów). Dopóki te odniesienia są zdefiniowane w formie tablicy, możesz leniwie ładować je za pomocą metod FetchRelated Relational.

myUser = new User(); 
myUser.set({ 
    name: 'RayMysterio', 
    age: '26', 
    events: [5, 7, 11] // Or this might just come with the User object from your server 
}); 

myUser.fetchRelated('events'); 
// This will go fetch the related events for this user model from the URL you designate. 

myUser.get('events'); 
// The collection of events are treated like an attribute of the User model. 

myUser.get('events').find(function(eventModel){ 
    return // some find condition - or whatever you want to do on that collection 
}); 

Możecie chcą wiązać pewne słuchaczy cząstkowych modeli.

myUser.bind('add:events', function(model, collection) { 
    // Whatever code you want to happen when new models are added to the user events coll 
}); 

Itp Itd

Jest to miły sposób wytwarzania jeden do jednego, jeden do wielu, i odwrotne relacje. To całkiem niezły klucz. Kiedy definiujesz relację między modelami i tworzysz model.

E.g. tworzysz nową instancję modelu użytkownika.

Relacja szkieletowa automatycznie tworzy odsyłacz odwrotny (model zdarzenia ma atrybut zdefiniowany przez klucz odwrotnej relacji "belongsToUser" (lub jakkolwiek go nazwiesz), co sprawia, że ​​bardzo przydatne jest przechodzenie w górę iw dół modelu/podrzędu Model hierarchia.

podstawie relacyjnych potrzeb wydaje się dobrym dopasowaniem.

Jeśli chcesz wiele do wielu, jest okrągłe o sposób to zrobić (przy użyciu modeli pośrednich), ale znalazłem To jest trochę nieudolne i unikam tego ... Paul-Uithol od jakiegoś czasu aktualizuje Backbone-Relational, a nowe funkcje wciąż są dodawane. Krzywa uczenia się początkowo była dla mnie trochę trudna, ale gdy zaczynasz przyzwyczaić się do tego, jest bardzo przydatny.

UWAGA: Dla podkreślenia, Mosselman poleca Require.js i ja też się z tym w pełni zgadzam. Dzięki temu mój kod jest znacznie łatwiejszy w zarządzaniu. Możesz tinkerować (owijać) kod relacyjny Backbone, aby był zgodny z AMD i działa bezbłędnie z Require.

UPDATE: kręgosłup-relacyjny wspiera teraz require.js jak wydania 0.8.8 w dniu 1 kwietnia 2014 roku - dzięki Kenneth

+0

Czy to możliwe, aby odnosić się do zdarzeń z użytkownikiem za pomocą modelu zdarzeń? 'myUser.set ('events', [myEvent1, myEvent2, myEvent3]);' coś w tym stylu? Czy musisz odwołać się do relacji za pośrednictwem powiązanego identyfikatora modelu? –

+1

@orangewarp backbone-relational obsługuje teraz require.js od wersji 0.8.8 1 kwietnia 2014. Zobacz http://backbonerelational.org/#change-log – Kenneth