Backbone: Sammlung und Modellabruf/Speicherung usw. Status

Erstellt am 24. Jan. 2013  ·  9Kommentare  ·  Quelle: jashkenas/backbone

Um zu wissen, ob die Sammlung aufgefüllt wurde oder wird, gibt es möglicherweise etwas wie


collection.fetch();
collection.isFetching()===true; // display loading 

(collection.isFetching()===false; && collection.length) // display no records found

Realer Anwendungsfall (Vereinfachung, die Objekte werden tief im System übergeben):

javascript() // somewhere in the code collection = new MyCollection(); // somewhere else in the code view = new MyView({collection:collection}); // and somewhere else in the code collection.fetch();

die Ansicht lauscht auf Sammelsignale und zeigt entweder Laden/keine Datensätze/Liste der Datensätze an

Für das Modell könnte es sogar eine Sache zum Speichern / Löschen / Aktualisieren geben

question

Hilfreichster Kommentar

@braddunbar , @caseywebdev die Idee ist, diese beiden Teile zu entkoppeln. (Ansicht sollte in der Lage sein, Sammlungen in jedem Zustand abzurufen, nicht nur _'saubere'_ Sammlungen)
Mir ist bewusst, dass ich dies mit Signalen tun kann, aber in vielen Fällen ist dies nicht möglich. Die Reihenfolge der Aktionen ist wichtig

Ich stimme zu, dass view auf 'request'- und 'sync'-Signale lauschen sollte, aber das Request-Signal kann gesendet werden, bevor die Sammlung an die View übergeben wird , daher hat view keine Ahnung, dass die Sammlung abgerufen wird.

Betrachten Sie ein Beispiel, bei dem Ihre Ansicht eine willkürliche Sammlung erhält. Diese Sammlung kann entweder _fetched_ , _fetching_ oder _unfetched_ sein, wenn sie an die Ansicht übergeben wird (tl:dr siehe Beispiel 3) .

Beispiel 1 (wo Signale funktionieren)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

Beispiel 2 (Ansicht wird bereits abgerufen, aber leere Sammlung, Signale funktionieren auch)

collection = new Backbone.Collection();
collection.fetch();  // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection}); 
view.render(); 
// at this point collection.length == 0. 
// I guess the view can listen to 'sync' and then render 'empty' 

Beispiel 3 (am wichtigsten, Signale funktionieren nicht)

collection = new Backbone.Collection();
collection.fetch();  // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render  'loading'
// after 2 seconds, 'sync' signal gets sent

Die Ansicht sollte nicht davon ausgehen, dass sie bei collection.length == 0 nicht abgerufen wird.
View sollte auch nicht davon ausgehen, dass ihm eine Sammlung im nicht abgerufenen Zustand (oder in einem anderen Zustand) gegeben wurde.

Wenn wir die Sammlung von der Ansicht entkoppeln möchten, muss die Ansicht in der Lage sein, den Sammlungsstatus zu kennen.

das gleiche gilt für das Modell

Alle 9 Kommentare

Hallo @g00fy-! Ich würde empfehlen, dass Sie zu diesem Zweck die Ereignisse "request" und "sync" verwenden. Was denken Sie?

collection.on('request', function() {
  // loading...
}).on('sync', function() {
  // display records or "none found"
});
collection.fetch();

_Edit - Ich meinte das "request" Event, nicht "fetch" ._

Ich finde das eine tolle Idee @braddunbar!

Danke @caseywebdev! :)

Lass es uns wissen, wenn das bei dir nicht funktioniert @g00fy-.

@braddunbar , @caseywebdev die Idee ist, diese beiden Teile zu entkoppeln. (Ansicht sollte in der Lage sein, Sammlungen in jedem Zustand abzurufen, nicht nur _'saubere'_ Sammlungen)
Mir ist bewusst, dass ich dies mit Signalen tun kann, aber in vielen Fällen ist dies nicht möglich. Die Reihenfolge der Aktionen ist wichtig

Ich stimme zu, dass view auf 'request'- und 'sync'-Signale lauschen sollte, aber das Request-Signal kann gesendet werden, bevor die Sammlung an die View übergeben wird , daher hat view keine Ahnung, dass die Sammlung abgerufen wird.

Betrachten Sie ein Beispiel, bei dem Ihre Ansicht eine willkürliche Sammlung erhält. Diese Sammlung kann entweder _fetched_ , _fetching_ oder _unfetched_ sein, wenn sie an die Ansicht übergeben wird (tl:dr siehe Beispiel 3) .

Beispiel 1 (wo Signale funktionieren)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

Beispiel 2 (Ansicht wird bereits abgerufen, aber leere Sammlung, Signale funktionieren auch)

collection = new Backbone.Collection();
collection.fetch();  // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection}); 
view.render(); 
// at this point collection.length == 0. 
// I guess the view can listen to 'sync' and then render 'empty' 

Beispiel 3 (am wichtigsten, Signale funktionieren nicht)

collection = new Backbone.Collection();
collection.fetch();  // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render  'loading'
// after 2 seconds, 'sync' signal gets sent

Die Ansicht sollte nicht davon ausgehen, dass sie bei collection.length == 0 nicht abgerufen wird.
View sollte auch nicht davon ausgehen, dass ihm eine Sammlung im nicht abgerufenen Zustand (oder in einem anderen Zustand) gegeben wurde.

Wenn wir die Sammlung von der Ansicht entkoppeln möchten, muss die Ansicht in der Lage sein, den Sammlungsstatus zu kennen.

das gleiche gilt für das Modell

@g00fy Wenn Sie die Sammlung nach dem Senden an die Ansicht nicht einfach fetch , setzen Sie ein fetching Flag oder ähnliches für Ihre Sammlung.

collection.on({
  request: function () { this.fetching = true; },
  'sync error': function () { this.fetching = false; }
});

Jetzt kann Ihre Ansicht auf this.collection.fetching zugreifen und auch warten, bis this.collection das Ereignis sync oder error ausgelöst hat.

@caseywebdev
Die Anfrage wird möglicherweise abgebrochen oder es werden zwei Anfragen gleichzeitig gesendet.

// example 1
collection.fetch().abort()  // and collection.fetching == true
// example 2 - don't care about abort();
collection.fetch();
collection.fetch();
// 1st request compleated
!!collection.fetching == false // but the 2nd request is pending - should it be loading or not?
// 2nd request completed

Die Lösung hierfür wäre, eine Verbindung mit deferred xhr . herzustellen

collection.on({
    'request':function(model,xhr){ 
        this.fetching = true; 
        xhr.fail(function(){this.fetching = false }.bind(this));
    },
    'sync error': function () { this.fetching = false; }
});

Aus diesem Grund denke ich, dass es praktisch sein könnte, dies zu integrieren, aber andererseits würde die BB-Codebasis aufgebläht, wenn jede Verbesserung wie diese durchkäme.

wenn jede Verbesserung wie diese durchkäme, wäre die BB-Codebasis aufgebläht.

Ich denke, es geht weniger um Blähungen als um Annäherung. Es gibt viele verschiedene Möglichkeiten, wie Sie gleichzeitige Anforderungen verarbeiten möchten. Backbone stellt Ihnen die Primitiven zur Verfügung, die Sie benötigen, um mit ihnen umzugehen, und geht dann aus dem Weg.

@g00fy- Vielleicht möchten Sie einen Blick darauf werfen, einen endlichen Automaten für Ihre Zwecke zu schreiben. Chaplin.js hat eine , die ziemlich einfach zu replizieren sein sollte, und es gibt auch ifandelse/machina.js (siehe Blog-Beitrag ), die für Ihren speziellen Anwendungsfall geeignet ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen