2013-02-12 14 views
7

Basierend auf der offiziellen Dokumentation unter Verwendung holen, wenn ich so etwas tun:Aktualisieren eine Sammlung mit Rückgrat

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

ich ein „add“ Ereignis für jedes neues Modell zu bekommen, und einen „change“ -Ereignis für jeden das bestehende Modell geändert, ohne etwas zu entfernen.

Warum, wenn ich eine statische Datenquelle aufruft (die URL der Sammlung gibt immer dasselbe json zurück), wird für jedes empfangene Element ein add-Ereignis aufgerufen.

Hier einige Code (ich bin Rendering nichts, ich bin das Debuggen nur):

<!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> 

Heres die 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); 

Grundsätzlich hole ich die Sammlung der default verwenden, ist es wird mit allen Modellen und Attributen korrekt abgerufen.

Und wenn ich auf den Refresh-Link klicke, rufe ich refreshView auf, was im Grunde versucht, die Sammlung mit neuen Modellen zu aktualisieren. Was ich nicht verstehe ist, warum, wenn die Antwort die gleiche ist, alle Modelle der Sammlung als neu erkannt werden, ein hinzufügen?

Heres a functional link: Öffnen Sie die Konsole und Sie werden sehen, wie die Add-Ereignisse aufgerufen werden, wenn Sie auf Aktualisieren klicken, auch wenn die Sammlung identisch ist.

Danke für Ihre Hilfe.

Antwort

12

Meine Vermutung wäre, dass Ihre Modelle keine idAttribute(doc) haben. Der Standardschlüssel, nach dem Backbone sucht, ist id und Ihre JSON-Einträge haben keinen, sodass nicht ersichtlich ist, welche Modelle bereits vorhanden sind.

Versuchen Sie Ihr Modell diese zu ändern (oder eine andere Taste, wenn diese nicht eindeutig ist):

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

ja, es war das Problem. Danke für Ihre Hilfe. – DiegoDevelopero

+0

Hallo zusammen .. Ich habe alle meine Modelle, Sammlungen und Ansichten im '$ (document) .ready();' Ich benutze auch den Backbone.router.extend. Wenn ich die aktuelle Seite aktualisiere, bleibt sie auf der aktuellen Seite. Keine Probleme damit .. Aber bei der Aktualisierung werden die Modelle und die Sammlungen wieder zurückgesetzt .. und dann ist es leer .. so kann ich nicht abrufen, was ich zuvor in der Sammlung gespeichert habe. Was soll ich machen? –

Verwandte Themen