¿Cómo puedo esperar a que se carguen varias tiendas? Tengo un caso en el que necesito hacer algo de trabajo solo cuando se cargan dos tiendas diferentes, por lo que usar el store.on("load", fn)
de una tienda no es suficiente.ExtJS esperando la carga de varias tiendas
Respuesta
Creo que se puede añadir detectores de carga para ambas tiendas, y comprobar si el otro terminó ...
this.getStore('store1').on('load',function(store){
if (this.getStore('store2').isLoading() == false){
// callMethod to perform action ....
}
},this);
this.getStore('store2').on('load',function(store){
if (this.getStore('store1').isLoading() == false){
// callMethod to perform action....
}
},this);
creo que de esta manera se llamará al método sólo cuando ambos están cargados suponiendo que se saber que la solicitud de carga se ha realizado para ambos.
He tenido algunos proyectos que requieren que se carguen varias tiendas antes de trabajar con los datos. Agregué una devolución de llamada para verificar si cada elemento en el Ext.data.StoreManager
se cargó y, de ser así, haría lo que necesitaba con los datos.
Para añadir las tiendas a la StoreManager sólo hay que darle un storeId
en su configuración, algo como esto:
var store1 = Ext.create('Ext.data.Store', {
model: myModel,
storeId: 'store1', //<-- adds this to Ext.data.StoreManager
proxy: {
type: 'ajax',
url: 'url...',
reader: 'json'
},
autoLoad: {
callback: initData
}
});
var store2 = Ext.create('Ext.data.Store', {
model: myModel,
storeId: 'store2',
proxy: {
type: 'ajax',
url: 'url...',
reader: 'json'
},
autoLoad: {
callback: initData
}
});
// Initialize store dependencies when all stores are loaded
function initData() {
var loaded;
Ext.data.StoreManager.each(function(store) {
loaded = !store.isLoading();
return loaded;
});
if(loaded) {
// do stuff with the data
}
}
No seguro, pero creo que el downvote se debió a 'loaded =! store.isLoading();' que debería ser 'loaded & =! store.isLoading();'. Ver esto [jsfiddle] (http://jsfiddle.net/JHMzp/1). Debería haber un comentario en cualquier caso, para ayudarnos a todos :) – aletzo
Por lo general evitar el problema, ya que me esfuerzo por minimizar ida y vuelta cliente/servidor y mejorar el rendimiento : Configuro autoLoad en falso en la tienda, luego realizo una solicitud explícita de ajax que obtiene los datos para todas las tiendas a la vez, luego uso store.loadData() para configurarlo directamente en cada tienda. La desventaja es, por supuesto, que requiere más código y los resultados en un acoplamiento más estricto.
Utilizamos esto cuando hay varias tiendas que esperar en:
Ext.define('Ext.ux.StoreLoadCoordinator', {
mixins: {
observable: 'Ext.util.Observable'
},
resetStoreLoadStates: function() {
this.storeLoadStates = {};
Ext.each(this.stores, function(storeId) {
this.storeLoadStates[storeId] = false;
}, this);
},
isLoadingComplete: function() {
for (var i=0; i<this.stores.length; i++) {
var key = this.stores[i];
if (this.storeLoadStates[key]==false) {
return false;
}
}
return true;
},
onStoreLoad: function(store, records, successful, eOpts, storeName) {
this.storeLoadStates[store.storeId] = true;
if (this.isLoadingComplete()==true) {
this.fireEvent('load');
this.resetStoreLoadStates();
}
},
constructor: function (config) {
this.mixins.observable.constructor.call(this, config);
this.resetStoreLoadStates();
Ext.each(this.stores, function(storeId) {
var store = Ext.StoreManager.lookup(storeId);
store.on('load', Ext.bind(this.onStoreLoad, this, [storeId], true));
}, this);
this.addEvents(
'load'
);
}});
Para usarlo, pase en una matriz de los StoreID relevantes:
var store1 = Ext.create('Ext.data.Store', {
storeId: 'Store1',
.... (rest of store config)
}});
var store2 = Ext.create('Ext.data.Store', {
storeId: 'Store2',
.... (rest of store config)
}});
var coordinatior = Ext.create('Ext.ux.StoreLoadCoordinator', {
stores: ['Store1', 'Store2'],
listeners: {
load: function() {
// Do post-load work
}
}
});
esto le dará una sola carga evento para manejar en múltiples tiendas. Tenga en cuenta que esto requiere Ext 4.x o posterior.
¡Excelente! Gracias – Black
Uso las tiendas de carga de cadena para resolver esto.
Contras: más lento de lo que debería ser.
chainStoreLoad :function (stores, lastCall, idx)
{
if (idx === stores.length) {
if ("function" === typeof lastCall) {
lastCall.call();
}
return;
}
stores[idx].load (function (r,o,s) {
Jx.chainStoreLoad (stores, lastCall, idx + 1);
});
}
Ejemplo:
Jx.chainStoreLoad (
[
this.storeAssetType
, this.storeAssetProcurement
, this.storeAssetStatus
, this.storeAssetLocation
, this.storeSystemUser
]
, function()
{
self.panel.doRefresh (perm);
}
, 0);
- 1. ExtJS 4: Rejillas/Tiendas sin modelos
- 2. Cómo destruir tiendas en ExtJS 4.1?
- 3. Esperando la carga de la ventana secundaria para completar
- 4. phantomjs no está esperando la carga de la página "completa"
- 5. ExtJS Escucha de carga de la tienda no se invoca
- 6. Javascript - ¿esperando a que vuelvan varias devoluciones de llamada asincrónicas?
- 7. Magento: Configuración de la página de inicio por defecto/tienda cuando tiene varias tiendas
- 8. RSpec: esperando un mensaje varias veces, pero con diferentes parámetros
- 9. ¿Cómo se espera hasta que todas las tiendas se carguen en ExtJs?
- 10. C++ getline() no está esperando la entrada de la consola cuando se llama varias veces
- 11. Ext JS 4: cómo crear instancias de varias tiendas y asignar a las vistas? (MVC)
- 12. ¿Cómo enviar, publicar y actualizar aplicaciones mediante programación a varias tiendas de aplicaciones móviles?
- 13. ¿Cómo sincronizo entre tiendas en Sencha Touch?
- 14. Google App Engine y tiendas clave-valor
- 15. ¿Debo evitar las tiendas Agile?
- 16. Extjs 3 a Extjs 4
- 17. Esperando en QUnit pruebas
- 18. Formulario de carga de varias partes: ¿Se garantiza el pedido?
- 19. Combinación de tiendas/cargas de variables atómicas consecutivas
- 20. ¿Puedo sincronizar varias llamadas de carga de imagen?
- 21. Carga de archivos de varias partes en Ruby
- 22. Comportamiento de carga inesperado de PhantomJS con varias páginas
- 23. Carga de varias imágenes con un campo de entrada
- 24. Múltiples tiendas de magento en dominio único
- 25. Esperando en varios eventos C++
- 26. Comprensión de las tiendas Key-Value
- 27. Almacenamiento de imágenes en tiendas NoSQL
- 28. NSPersistentStoreCoordinator con dos tipos de tiendas persistentes?
- 29. Obteniendo una lista de tiendas magento
- 30. ¿Cómo actualizo varias instancias de EC2 con carga equilibrada?
relacionada a http://stackoverflow.com/questions/11003605/how-to-wait-until-all-stores-are-loaded-in-extjs – Patrick