2017-06-14 1 views
1

Ich habe eine Backbone-Sammlung, die ich über einen API-Endpunkt bevölkere. Diese Rückkehr Daten wie:Backbone - Aktualisieren von Modellen in einer Sammlung mit Daten, die von einer anderen API abgerufen werden

[ 
    { 
     "gameId": 1234, 
     "gameName": "Fun Game 1" 
    }, 
    { 
     "gameId": 1235, 
     "gameName": "Fun Game 2" 
    }, 
    { 
     "gameId": 1236, 
     "gameName": "Fun Game 3" 
    }, 
    etc, 
    etc, 
    etc 
] 

Die Kollektion ist sehr einfach und wird im Router initialisiert, so dass es auf die gesamte App zugänglich ist:

var GamesCollection = Backbone.Collection.extend({ 
     model: GameModel, 
     url: '/path/to/games/list', 

     parse:function(response){ 
      return response; 
     } 
    }); 

habe ich eine anderen Endpunkt, der eine Sammlung von Daten zurückgibt verwandter zu den ursprünglichen Daten. Diese Daten können wie folgt aussehen:

[ 
    { 
     "gameId": 1234, 
     "numberOfPlayers": "1,000" 
    }, 
    { 
     "gameId": 1235, 
     "numberOfPlayers": "Fun Game 2" 
    }, 
    { 
     "gameId": 9999, 
     "numberOfPlayers": "Some other game that's not in the original list" 
    } 
] 

Beachten Sie, dass die number of players Antwort oder Daten enthalten kann nicht für jedes Spiel in der ursprünglichen Antwort und kann oder auch nicht Daten für Spiele enthält, die in der Original-Spielen Antwort gibt es nicht.

Ich muss den number of players Endpunkt alle X Minuten abfragen und die Modelle in der GamesCollection mit den Daten aus der Antwort aktualisieren, damit ich dies in der Ansicht anzeigen kann.

Was ist der beste Weg, damit umzugehen?

Antwort

1

Fragen Sie Ihre numberOfPlayers Endpunkt und dann set the fetched data on your collection. Sie können anpassen, wie set mit add und remove Optionen funktioniert.

Zum Beispiel

var GamesCollection = Backbone.Collection.extend({ 
    model: GameModel, 
    url: '/path/to/games/list', 

    parse: function(response){ 
     return response; 
    }, 

    pollNumberOfPlayers: function() { 
     var self = this; 
     return Backbone.ajax('/numberOfPlayers/endpoint').then(function(resp) { 
      self.set(resp, {add: false, remove: false, merge: true}); 
     }); 
    }, 

    startPolling: function() { 
     var self = this, 
      timer = 10000; //10 seconds 

     self.pollNumberOfPlayers().then(function() { 
      setTimeout(function() { 
       self.startPolling(); 
      }, timer); 
     }); 
    } 
}); 

Beachten Sie, dass ich Ihre GameModel Objekte als ihre idAttribute haben gameId angenommen.

Verwandte Themen