2012-04-06 10 views
5

Aby nauczyć się kręgosłupa, tworzę aplikację podobną do Twittera. Więc wiesz, że Twitter wysyła żądanie GET do serwera co N sekund, aby sprawdzić nowe tweety. Jeśli są nowe tweety, tworzy ukryte elementy i pokazuje przycisk z "N nowe tweety". Jeśli go klikniesz, wyświetli ukryte elementy li, pokazując nowe tweety. Ale zachowanie jest inne, gdy dodajesz nowy tweet: tweet jest widoczny. Nie musisz klikać przycisku, aby go zobaczyć.Backbone collection.create() nie zwraca zaktualizowanego modelu.

Już zrobiłem pierwszą część, dla ukrytych tweetów. Dla części zamieszczając nowy tweet i przedstawiający go direclty, myślałem, że będzie łatwo zrobić poprzez stworzenie nowego modelu, nazywając collection.create() i wywołując odpowiednią wydarzenie, coś takiego:

var newTweet = new Tweet(); 
newTweet.set(/* set the attributes here. Some attributes are missing, because they are calculated server side */); 

var created_tweet = this.collection.create(newTweet, { silent: true, wait: true }); // I choose silent=true because the add event on my collection is in charge of adding the new hidden tweets when there are new ones on the server 
this.collection.trigger("posted_new_tweet", created_tweet); 

Następnie moja kolekcja subskrybuje wydarzenie "posted_new_tweet", więc za każdym razem, gdy użytkownik wysyła nowy tweet, wywoływana jest określona metoda mojej kolekcji. To podejście działało dobrze, dopóki nie otrzymałem błędów z powodu zmiennej created_comment przekazanej w wyzwalaczu: nie jest ona "kompletna". Mam na myśli, że model ma pewne atrybuty, takie jak "id" lub * "created_on" *, które są niezdefiniowane. Te atrybuty są obliczane po stronie serwera, ale pomyślałem, że jeśli przekażę wait = true, to będzie czekać i zaktualizować mój model z odpowiedzią udzieloną przez serwer (gdy zostanie wysłane do serwera żądanie, POST, zwraca ono nowy stworzony model w json)

Czy mój model nie powinien mieć atrybutów po stronie serwera? Czy jest to właściwe podejście do takiego problemu? Jeśli nie jest, w jaki sposób mogę mieć 2 różne metody wyświetlania widoku kolekcji?

Dziękujemy!

Odpowiedz

14

create jest nadal asynchroniczny, nawet jeśli zdasz { wait: true }. Różnica polega na tym, że model zostanie natychmiast dodany do kolekcji, podczas gdy z kręgosłupem wait nie doda go do kolekcji, dopóki nie odniesie sukcesu z serwera.

Co należy zrobić, to dodać skuteczny oddzwaniacz do create, który uruchamia zdarzenie po odpowiedzi serwera.

var created_tweet = this.collection.create(newTweet, { silent: true, wait: true, success: this.successCallback }); 

// Add successCallback as a method to the collection 
successCallback: function(collection, response) { 
    // I'm not 100% positive which values are passed to this function. Collection may actually be the new model. 
    this.collection.trigger("posted_new_tweet", created_tweet); 
} 
+0

Zgadza się :) Dziękuję! – fiunchinho

+0

Wierzę, że w późniejszych wersjach Backbone, argumenty są teraz 'nextModel' i' response'. – IanS

Powiązane problemy