underscore source examples backbone annotated backbone.js

backbone.js - source - underscore js download



Espera a que la colección recupere todo en el backbone. (6)

Estoy usando RelationalModel y creé una recuperación en cola, que solo llama al evento ''cambio'' cuando termino de cargar:

var MySuperClass = Backbone.RelationalModel.extend({ //... _fetchQueue : [], fetchQueueingChange : function(name){ //Add property to the queue this._fetchQueue.push(name); var me = this; //On fetch finished, remove it var oncomplete = function(model, response){ //From _fetchQueue remove ''name'' var i = me._fetchQueue.indexOf(name); me._fetchQueue.splice(i, 1); //If done, trigger change if (me._fetchQueue.length == 0){ me.trigger(''change''); } }; this.get(name).fetch({ success: oncomplete, error : oncomplete }); }, //... });

La clase llamaría:

this.fetchQueueingChange(''categories''); this.fetchQueueingChange(''items'');

Espero que puedas mejorar esto, funcionó bien para mí.

Tengo dos conjuntos de colecciones. Uno es para las categorías y el otro es para los artículos. Necesito esperar a que las categorías terminen de buscarme todo para que yo establezca la categoría para los artículos que se van a buscar.

Además, cada vez que hago clic en una categoría, debo recuperar una nueva Colección de artículos porque tengo una paginación en curso cada vez que hago clic en una categoría que no actualiza ni vuelve a buscar la colección, por lo que el código de paginación está jugando con la colección incorrecta. . ¿Algunas ideas?

this.categoryCollection = new CategoryCollection(); this.categoryCollection.fetch(); this.itemCollection = new ItemCollection(); this.itemCollection.fetch();


Simplemente se topó con una situación similar. Terminé pasando los parámetros jquery.ajax a la llamada fetch (). Puedes hacer la primera búsqueda síncrona. De los documentos de la columna vertebral :

Las opciones de jQuery.ajax también se pueden pasar directamente como opciones de recuperación

Su código podría ser simplificado a algo como:

this.categoryCollection.fetch({async:false}); this.itemCollection.fetch();


Terminé con el mismo problema hoy y encontré una solución a esto:

var self = this; this.collection = new WineCollection(); this.collection.url = ApiConfig.winetards.getWineList; this.collection.on("reset", function(){self.render()}); this.collection.fetch({reset: true});

Ahora, cuando se completa la búsqueda en la colección, se activa un "reinicio" y al "reiniciar" se llama al método render () para la vista.

Usar {async: false} no es la manera ideal de lidiar con la búsqueda de Backbone ().


Tuve que reaccionar a este hilo debido a las respuestas allí.

Esta es la única manera de hacer este derecho!

this.categoryCollection = new CategoryCollection(); this.itemCollection = new ItemCollection(); var d1 = this.categoryCollection.fetch(); var d2 = this.itemCollection.fetch(); jQuery.when(d1, d2).done(function () { // moment when both collections are populated alert(''YOUR COLLECTIONS ARE LOADED :)''); });

Al hacer eso, está obteniendo ambas colecciones al mismo tiempo y puede tener un evento cuando ambas están listas. ¡Así que no esperas a terminar de cargar las primeras colecciones para buscar otras, no estás sincronizando las llamadas ajax, etc. que puedes ver en otras respuestas!

Aquí hay un documento sobre objetos diferidos .

Nota: en este caso de ejemplo, cuando uno o más objetos diferidos fallan, no está cubierto. Si desea cubrir ese caso también junto a .done , tendrá que agregar .fail callback en .when y también agregar el controlador de error que marcará el error d1 o d2 en este ejemplo.


Una forma rápida sería pasar una devolución de llamada a la primera llamada fetch() que invoca a la segunda. fetch() toma un objeto de options que admite una devolución de llamada correcta (y error ).

var self = this; this.categoryCollection = new CategoryCollection(); this.categoryCollection.fetch({ success: function () { self.itemCollection = new ItemCollection(); self.itemCollection.fetch(); } });

No es el más elegante, pero funciona. Probablemente podrías hacer algunas cosas creativas con aplazados ya que fetch() devuelve el jQuery aplazado que se crea con la llamada $.ajax que sucede.

Para el problema de la paginación, es difícil decirlo sin ver lo que hace el código de paginación. Tendrá que enrollar las cosas de paginación usted mismo ya que Backbone no lo admite de forma nativa. Lo que probablemente haría es crear una nueva Colección para los criterios de la página que se consultan y probablemente crear una acción del servidor que pueda realizar que sea compatible con la paginación (mapear la url la Colección con la acción del servidor paginado). Sin embargo, no he pensado mucho en eso.


solo configura jQuery para que se vuelva sincrónico

$.ajaxSetup({ async: false }); this.categoryCollection.fetch(); this.itemCollection.fetch(); $.ajaxSetup({ async: true });

Esta es la solución más simple, supongo. Por supuesto, el inicio de nuevas solicitudes mientras se ejecutan estas recuperaciones también se iniciará como síncrono, lo que podría ser algo que no le guste