Backbone: Estado de recuperación / guardado de colección y modelo, etc.

Creado en 24 ene. 2013  ·  9Comentarios  ·  Fuente: jashkenas/backbone

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

question

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)

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

Ejemplo 2 (la vista ya se recupera, pero la colección vacía, las señales también funcionarán)

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' 

Ejemplo 3 (lo más importante, las señales no funcionarán)

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

Todos 9 comentarios

¡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) .

Ejemplo 1 (donde funcionarán las señales)

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

Ejemplo 2 (la vista ya se recupera, pero la colección vacía, las señales también funcionarán)

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' 

Ejemplo 3 (lo más importante, las señales no funcionarán)

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

alundiak picture alundiak  ·  7Comentarios

rafde picture rafde  ·  9Comentarios

tribalvibes picture tribalvibes  ·  11Comentarios

miguelpayet picture miguelpayet  ·  9Comentarios

jamiebuilds picture jamiebuilds  ·  12Comentarios