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
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) .
collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent
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'
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.
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)
Beispiel 2 (Ansicht wird bereits abgerufen, aber leere Sammlung, Signale funktionieren auch)
Beispiel 3 (am wichtigsten, Signale funktionieren nicht)
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