2013-02-12 11 views
7

Na podstawie oficjalnej dokumentacji, gdy robię coś takiego:Aktualizacja kolekcji korzystając pobrać ze szkieletem

collection.fetch({update: true, remove: false}) 

otrzymuję „Dodaj” zdarzenie dla każdego nowego modelu, a „zmiana” zdarzenie dla każdego zmienił istniejący model, bez usuwania czegokolwiek.

Dlaczego, jeśli wywołuję statyczne źródło danych (adres URL kolekcji zawsze zwraca ten sam json), zdarzenie add jest wywoływane dla każdego otrzymanego przedmiotu?

Oto niektóre kodu (nie mam nic renderowania, ja tylko debugowanie):

<!doctype html> 
<html> 
    <head> 
    <title>Example</title> 
    </head> 
    <body> 
    <a href="#refresh">Refresh</a> 
    <script src="js/jquery-1.8.3.min.js"></script> 
    <script src="js/underscore-min.js"></script> 
    <script src="js/backbone-min.js"></script> 
    <script src="js/main.js"></script> 
    </body> 
</html> 

Herezje JS

(function($){ 
    //Twitter Model 
    ModelsTwitt = Backbone.Model.extend({}); 
    //Twitter Collection 
    CollectionsTwitts = Backbone.Collection.extend({ 
     model:ModelsTwitt, 
     initialize:function(){ 
      console.log('Twitter App Started'); 
     }, 
     url:'data/195.json' 
    }); 
    //Twitts View 
    ViewsTwitts = Backbone.View.extend({ 
     el:$('#twitter-list'), 
     initialize:function(){ 
      _.bindAll(this, 'render'); 
      this.collection.bind('reset',this.render); 
      this.collection.bind('add',this.add); 
     }, 
     render:function(){ 
      console.log("This is the collection",this.collection); 
     }, 
     add:function(model){ 
      console.log("add event called",model); 
     } 
    }); 
    //Twitter Router 
    Router = Backbone.Router.extend({ 
     routes:{ 
      '':'defaultRoute',//Default list twitts route 
      'refresh':'refreshView' 
     }, 
     defaultRoute:function(){ 
      this.twitts = new CollectionsTwitts(); 
      new ViewsTwitts({collection:this.twitts}); 
      this.twitts.fetch(); 
     }, 
     refreshView:function(){ 
      this.twitts.fetch({update:true,remove:false}); 
     } 
    }); 
    var appRouter = new Router(); 
    Backbone.history.start(); 
})(jQuery); 

Zasadniczo sprowadzić kolekcję używając defaultroute, to jest poprawnie pobierany ze wszystkimi modelami i atrybutami.

Po kliknięciu odnośnika odświeżam, wywoływam refreshView, który zasadniczo próbuje zaktualizować kolekcję nowymi modelami. Nie rozumiem, dlaczego jeśli odpowiedź jest taka sama, wszystkie modele kolekcji są wykrywane jako nowe, powodując dodanie add?

Heres a functional link: otwórz konsolę, a zobaczysz, jak zdarzenia dodawania są wywoływane po kliknięciu przycisku Odśwież, nawet jeśli kolekcja jest taka sama.

Dzięki za pomoc.

Odpowiedz

12

Domyślam się, że Twoje modele nie mają idAttribute(doc). Klucz domyślny, którego szuka Backbone to id, a twoje wpisy JSON nie mają takiego, więc nie można stwierdzić, które modele już tam są.

Spróbuj zmienić swój model do tego (lub innego klucza, jeśli ten nie jest wyjątkowy):

ModelsTwitt = Backbone.Model.extend({ 
    idAttribute: 'id_event' 
}); 
+2

tak, to był problem. Dzięki za pomoc. – DiegoDevelopero

+0

Witam. Mam wszystkie moje modele, kolekcje i widoki w '$ (document) .ready();' Używam również Backbone.router.extend. Ilekroć odświeżam bieżącą stronę, pozostaje ona na bieżącej stronie. Żadnych problemów z tym .. Ale po odświeżeniu modele i kolekcje są resetowane ponownie ... a następnie puste ... więc nie mogę pobrać, co wcześniej zapisałem w kolekcji. Co powinienem zrobić? –

Powiązane problemy