Para poder saber si la colección estaba poblada, o si se está poblando, puede haber algo como
collection.fetch();
collection.isFetching()===true; // display loading
(collection.isFetching()===false; && collection.length) // display no records found
Caso de uso real (simplificación, los objetos se pasan a lo profundo del sistema):
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();
la vista escucha las señales de colección y muestra cargando / sin registros / lista de registros
para el modelo, incluso podría haber algo para guardar / eliminar / actualizar
¡Hola @ g00fy-! Le recomendaría que utilice los eventos "request"
y "sync"
para este propósito. ¿Qué piensas?
collection.on('request', function() {
// loading...
}).on('sync', function() {
// display records or "none found"
});
collection.fetch();
_Editar - Me refiero al evento "request"
, no "fetch"
._
¡Creo que es una buena idea @braddunbar!
¡Gracias @caseywebdev! :)
Háganos saber si eso no funciona para usted @ g00fy-.
@braddunbar , @caseywebdev la idea es desacoplar esas dos partes. (la vista debería poder obtener la colección en cualquier estado, no solo la colección _'clean'_)
Soy consciente de que puedo hacer esto usando señales, pero en muchos casos esto no se puede hacer de esta manera. El orden de las acciones importa
Estoy de acuerdo en que la vista debe escuchar las señales de 'solicitud' y 'sincronización', pero la señal de solicitud puede enviarse antes de que la colección se pase a la vista , por lo tanto, la vista no tiene idea de que la colección se está recuperando.
Considere un ejemplo, donde su vista obtiene una colección arbitraria. Esta colección puede ser _fetched_, _fetching_ o _unfetched_ cuando se pasa a la vista (tl: dr ver ejemplo 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
La vista no debe asumir que si collection.length == 0, no se ha obtenido.
La vista tampoco debe asumir que se le ha dado una colección en estado no obtenido (o en cualquier otro estado).
Si queremos desacoplar la colección de la vista, entonces la vista debe poder saber cuál es el estado de la colección.
lo mismo ocurre con el modelo
@ g00fy Si no puede fetch
la colección después de enviarla a la vista, establezca una bandera fetching
o algo así en su colección.
collection.on({
request: function () { this.fetching = true; },
'sync error': function () { this.fetching = false; }
});
Ahora su vista puede acceder a this.collection.fetching
y también esperar a que this.collection
active el evento sync
o error
.
@caseywebdev
Es posible que la solicitud se anule o que se envíen dos solicitudes a la vez.
// 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
La solución a esto sería conectar do diferido xhr
collection.on({
'request':function(model,xhr){
this.fetching = true;
xhr.fail(function(){this.fetching = false }.bind(this));
},
'sync error': function () { this.fetching = false; }
});
Por eso, creo que esto podría ser útil para tener esto integrado, pero por otro lado, si todas las mejoras como esta se lograran, la base de código BB se inflaría.
si todas las mejoras como esta se lograran, la base de código BB se inflaría.
Creo que se trata menos de hinchazón que de acercamiento. Hay muchas formas diferentes en las que puede querer manejar solicitudes simultáneas. Backbone le proporciona las primitivas que necesita para manejarlas y luego se quita del camino.
@ g00fy- es posible que desee echar un vistazo a la escritura de una máquina de estados finitos para sus propósitos. Chaplin.js tiene uno que debería ser bastante fácil de replicar, y también hay ifandelse / machina.js (consulte la publicación del
Comentario más útil
@braddunbar , @caseywebdev la idea es desacoplar esas dos partes. (la vista debería poder obtener la colección en cualquier estado, no solo la colección _'clean'_)
Soy consciente de que puedo hacer esto usando señales, pero en muchos casos esto no se puede hacer de esta manera. El orden de las acciones importa
Estoy de acuerdo en que la vista debe escuchar las señales de 'solicitud' y 'sincronización', pero la señal de solicitud puede enviarse antes de que la colección se pase a la vista , por lo tanto, la vista no tiene idea de que la colección se está recuperando.
Considere un ejemplo, donde su vista obtiene una colección arbitraria. Esta colección puede ser _fetched_, _fetching_ o _unfetched_ cuando se pasa a la vista (tl: dr ver ejemplo 3) .
Ejemplo 1 (donde funcionarán las señales)
Ejemplo 2 (la vista ya se recupera, pero la colección vacía, las señales también funcionarán)
Ejemplo 3 (lo más importante, las señales no funcionarán)
La vista no debe asumir que si collection.length == 0, no se ha obtenido.
La vista tampoco debe asumir que se le ha dado una colección en estado no obtenido (o en cualquier otro estado).
Si queremos desacoplar la colección de la vista, entonces la vista debe poder saber cuál es el estado de la colección.
lo mismo ocurre con el modelo