2011-09-12 14 views
17

Say mam konfigurację trasy:Pobieranie pojedynczy model Backbone z serwera

'photos/:id' : 'showPhoto' 

i ktoś podziela link: www.mysite.com/photos/12345 z przyjacielem.

Gdy znajomy kliknie udostępniony link, zostanie wywołana showPhoto z powrotem z 12345 przekazanym jako identyfikator. Nie mogę dowiedzieć się, jak pobrać model z serwera, ponieważ nawet gdy ustawienie jego właściwości id i wywołanie fetch(), kręgosłup uważa, że ​​model isNew a więc ajax żądanie url jest właśnie /photos zamiast /photos/12345:

showPhoto: (id) -> 
    photo = new models.Photo _id:id 
    photo.fetch #does a GET to /photos, I would have expected it to request /photos/12345 
    success:() -> 
     render photo view etc... 

Photo = Backbone.Model.extend 
    idAttribute: '_id' 
    urlRoot: '/photos' 

Model Photo jest zazwyczaj częścią kolekcji, ale w tym scenariuszu ktoś odwiedza witrynę bezpośrednio i oczekuje tylko wyświetlenia danych dla jednego zdjęcia, więc kolekcja nie jest tworzona w tym stanie aplikacji.

Czy można załadować całą kolekcję zdjęć, a następnie użyć collection.getById(id)? To wydaje się po prostu zbyt mało wydajne, gdy chcę tylko załadować właściwości dla jednego modelu.

Odpowiedz

25

jeśli nie masz model jako część kolekcji, trzeba ręcznie powiedzieć modelowi pełny adres URL. nie doda automatycznie identyfikatora do podanego urlRoot. można określić funkcję jako UrlRoot Aby to zrobić:

Photo = Backbone.Model.extend({ 
    urlRoot: function(){ 
    if (this.isNew()){ 
     return "/photos"; 
    } else { 
     return "/photos/" + this.id; 
    } 
    } 
}); 

Backbone używa id modelu w celu określenia, czy to nowy, czy nie, więc po ustawieniu, że kod ten powinien działać poprawnie. jeśli nie, zawsze możesz sprawdzić id w instrukcji if zamiast sprawdzać isNew.

+0

Derick, jak się dowiedziałeś o kręgosłupie? Nie znalazłem żadnego ostatecznego przewodnika. Czytam Podstawy i Przepisy Addy Osmani z kręgosłupem, a także niezliczone blogi, w tym twoje. Wydaje się, że masz o wiele głębsze zrozumienie niż większość. Gdzie go odebrałeś? – AndrewHenderson

+10

Próba i błąd, czytanie kodu źródłowego Backbone, czytanie wszystkiego, co mogę na ten temat, uczenie się jak najwięcej o JavaScript ... ale głównie próbowanie uczyć innych ludzi. Nauczanie innych zmusza cię do głębokiego kopania i do zrozumienia, co się dzieje. :) –

+1

Wydaje się, że jest to opatrzona datą odpowiedź, ponieważ poprawiły się API Backbone. Czy możemy poprawić tę odpowiedź? – sankargorthi

1

bym bootstrap kolekcję (pełniąc następujące na stronę) za pomocą jednego modelu w to tak:

photos = new PhotoCollection(); 
photos.reset([ @Html.ToJson(Model) ]); 

Należy pamiętać, że serwer kod z boku, który używam jest ASP.Net MVC więc używać coś charakterystycznego dla architektury po stronie serwera. Zwróć też uwagę, że nawiasy kwadratowe są ważne, ponieważ biorą twój niepowtarzalny model i zawijają go w tablicy.

Mam nadzieję, że to pomocne.

3

Robisz nie trzeba mówić kręgosłupowi, czy dodać URL do adresu URL. Zgodnie z dokumentacją: http://backbonejs.org/#Model-fetch, możesz po prostu ustawić adres urlRoot na odpowiednik adresu URL w kolekcji.

Backbone automatycznie dołączy żądaną id do URL, pod warunkiem korzystania z jednej z następujących metod:

model.set("id", 5); //After initialized 
model = new Backbone.Model({id: 5}); //New model 

Jeśli ręcznie ustawić identyfikator w hash atrybutów lub bezpośrednio na modelu, kręgosłup wygrał” bądź tego świadomy.

Powiązane problemy