2017-03-01 1 views
0

Ich versuche, mehrere Ansichten mit einer Sammlung und einem Abruf alle 5 Sekunden zu generieren.Backbone.js mehrere Ansichten, eine Sammlung, ein Abruf

Unten ist ein funktionierendes Beispiel, aber beide Ansichten werden beim Abrufen aktualisiert. Ich könnte die Antwort in mehrere URLs splice, aber ich möchte die Anzahl der Anfragen minimieren.

Mein aktuelles Problem ist, dass ich nicht alle Ansichten alle 5 Sekunden erneut rendern möchte, wenn die Sammlung erneut abgerufen wird, nur die verknüpfte Ansicht, die geändert wurde. Ich habe versucht, mehrere Modelle in der Sammlung zu erstellen und das richtige Objekt in der Parse-Funktion ohne Glück hinzuzufügen.

Antwort:

{ 
    "json-1": { 
    "sub_1": "3", 
    "sub_2": [], 
    }, 
    "json-2": { 
    "sub_1": [], 
    "sub_2": "1", 
    }, 
} 

// Client

const APICollection = Backbone.Collection.extend({ 
    initialize: (models, options) => { 
     this.id = options.id; 
    }, 
    url:() => { 
     return 'https://url.url/' + this.id; 
    }, 
    model: APIModel, 
     parse: (resp) => { 
     return resp; 
    }, 
}); 

const ViewOne = Backbone.View.extend({ 
    initialize: function() { 
     this.collection.bind('sync', this.render, this); 
     this.update(); 
     _.bindAll(this, 'update'); 
    }, 
    render: function (n, collection) { 
     // Render view 
    }, 
    update: function() { 
     let self = this; 
     this.collection.fetch({ 
      update: true, remove: false, success: function() { 
       setTimeout(self.update, 5000); 
      } 
     }); 
    } 
}); 

// Also updates when re-fetched 
const ViewTwo = Backbone.View.extend({ 
    initialize: function() { 
     this.collection.bind('sync', this.render, this); 
    }, 
    render: function (n, collection) { 
     // Render function 
    } 
}); 

let col = APICollection([], {id: 'someid'}); 
new ViewOne({collection: col, el: $("#one")}); 
new ViewTwo({collection: col, el: $("#two")}); 

** Update

Um zu klären: "nur die zugehörige Ansicht, die geändert". Damit meine ich, dass 'ViewOne' nur dann neu gerendert werden sollte, wenn 'json-1' geändert wurde und 'ViewTwo' nicht erneut gerendert werden soll. Derzeit wird die vollständige Antwort an beide Ansichten gesendet.

+0

"... nur die verknüpfte Ansicht, die geändert wurde." - Sie müssen dies klären, beziehen sich bestimmte Modelle in der Sammlung auf bestimmte Ansichten? Was unterscheidet eine Ansicht von einer anderen in der Art, wie sie mit der Sammlung funktioniert? – mikeapr4

+0

Ich werde die Frage aktualisieren – coop

+0

Wenn Ihre Antwort kein Array zurückgibt, sollten Sie "Backbone.Model" nicht "Backbone.Collection" verwenden, dann können Sie 'Change: attr' -Ereignisse in jeder Ansicht hören. – mikeapr4

Antwort

0

Wenn Sie mit einer API arbeiten, die ein Objekt und kein Array von Objekten zurückgibt, ist der beste Ansatz, eine Backbone.Model direkt zu verwenden.

update: function() { 
    let self = this; 
    this.model.fetch({ 
     update: true, remove: false, success: function() { 
      setTimeout(self.update, 5000); 
     } 
    }); 
} 

Das Modell wird geholt immer noch die gleiche Art und Weise wie die Sammlung, aber die Ansichten zu bestimmten Attributen auf dem Modell hören, statt:

this.collection.bind('sync', this.render, this); 

Folgendes kann verwendet werden:

this.model.bind('change:json-1', this.render, this); 

Tipp: Besser listenTo anstatt binden, es ist sicherer (siehe docs)

+1

'setTimeout (self.update, 5000);' wird nicht funktionieren, da der Kontext bei der ersten Ausführung des Timeout-Callbacks verloren geht. Stattdessen sollten Sie die Option 'context' der Funktion' fetch' verwenden und 'this.update.bind (this)' an 'setTimeout' übergeben. –

+1

Mit dieser Technik wird beim ersten Fehler die 5-Sekunden-Schleife gestoppt. –

+0

@EmileBergeron - nicht sicher, der Kontext wird verloren gehen, aber sicherlich einige bessere Fehlerbehandlung wäre gut. Ein Punkt würde ich hinzufügen, wenn es mein Code wäre, würde ich den Re-Fetch-Mechanismus innerhalb des Modells hinzufügen, nicht die Ansicht, in Bezug auf die Model/View-Abstraktion, es ist ein wenig sauberer. – mikeapr4

Verwandte Themen