2011-05-03 16 views
6

Tengo un almacén de datos personalizado que almacena la información si la tienda se ha cargado una vez o no.ExtJS Escucha de carga de la tienda no se invoca

/** 
* Custom DataStore which stores the information whether data has been loaded once or not. 
*/ 
Ext.example.Store = Ext.extend(Ext.data.Store, { 
    loaded: false, 
    initComponent: function() { 
     this.superclass().initComponent.call(this); 
     this.addEvents('load','beforeload'); 
    }, 
    isLoaded : function() { 
     return this.loaded; 
    }, 
    listeners: { 
     'load' : function(store,records,options) { 
      this.loaded = true; 
     } 
    } 
}); 

Esto funcionaba bien hasta hace poco. Agregué un detector de eventos 'beforeload' a una instancia de esta tienda. El oyente de 'carga' no se invoca ahora.

var accountsDataStore = new Ext.example.Store({ 

    id : 'account', 
    proxy : new Ext.data.HttpProxy({ 
     url : 'app/account/fetch/all', 
     method : 'post', 
     api : { 
      destroy : 'app/account/delete' 
     } 
    }), 
    reader : accountReader, 
    writer : accountWriter, 
    remoteSort : true, 
    sortInfo : { 
     field : 'createdOn', 
     direction : "DESC" 
    }, 
    listeners: { 
     beforeload: function(store, options) { 
      var sort = options.params.sort; 
      // setting the sort parameters to match the property names in the DTO 
      switch(sort) { 
       case 'company' : 
        options.params.sort = 'company.name'; 
        break; 
       default: 
        // do nothing 
      } 
     } 
    } 

}); 

¿Qué podría estar haciendo mal aquí? También déjenme saber sus sugerencias para mejorar

+0

Dónde estás cargando la tienda? No puedo ver ninguna opción autoLoad: true o accountsDataStore.load(). – Swar

+0

Intento cargar la tienda haciendo clic en una pestaña. Mi intención no es cargar la tienda si la tienda se ha cargado previamente: \t 'if (! AccountsDataStore.isLoaded()) { accountsDataStore.load(); } '. El 'isLoaded' siempre devuelve falso, ya que el oyente de carga nunca se invoca. – Joji

+0

Hola, estoy enfrentando el mismo problema. ¿Puedes decirme cómo resolviste este problema? – Shekhar

Respuesta

0

Ok, creo que hay un problema con el alcance. Por favor, intente esta manera:

listeners: { 
     'load' : { 
      fn : function(store,records,options) { 
       console.log(this, this.loaded); 
       this.loaded = true; 
      }, 
      scope : this 
     } 
    } 

O puede utilizar:

listeners: { 
     'load' : function(store,records,options) { 
      store.loaded = true; 
     } 
    } 
+2

El hecho es que el oyente de carga ni siquiera se invoca. – Joji

+0

cambie esta línea: this.superclass(). InitComponent.call (this); a Ext.example.Store.superclass.initComponent.call (this); Y no agregue un evento de carga ya que un evento de carga de tienda ya existe. – Swar

+0

desafortunadamente parece que no es el problema – Joji

1

La documentación de los "beforeload" estados de eventos:

"Los incendios antes se realiza una solicitud para una nuevo objeto de datos. Si el controlador de carga previa devuelve falso, la acción de carga se cancelará ".

Puede intentar devolver verdadero desde su oyente de carga previa para garantizar que la acción de carga aún se ejecuta.

5

El problema es que nunca se debe fijar objetos en el prototipo, a menos que realmente sabe lo que significa (que va a ser compartida por todas las instancias y se puede sustituir en una base por ejemplo)

En Ext JS , Solo establezco opciones de configuración en el prototipo que son solo por conveniencia y pueden ser anuladas por la persona que llama.

Su primera clase Ext.example.Store pone a los oyentes en su prototipo. Luego, vaya y sobrescriba en accountsDataStore pasando un objeto listeners a la configuración.

Para solucionar su problema, en lugar de configurar detectores en el prototipo, simplemente llame al this.on('event') desde el constructor.

/** 
* Custom DataStore which stores the information whether data has been loaded once or not. 
*/ 

Ext.example.Store = Ext.extend(Ext.data.Store, { 
    loaded: false, 
    constructor: function() { 
     this.superclass().constructor.call(this); 
     // No need to call this, you're not adding any events 
     // this.addEvents('load','beforeload'); 
     this.on('load', function(store,records,options) { 
      this.loaded = true; 
     }, this); 
    }, 
    isLoaded : function() { 
     return this.loaded; 
    } 
}); 
1

store.totalCount

si está cargado, esta propiedad devuelve un número demás esta propiedad no está definida (extjs-4.1.0-RC1)

Cuestiones relacionadas