Foro

[Solucionado] Interceptar errores en un Store

0
Hola a todos. Estoy tratando de añadir el siguiente comportamiento a un Ext.data.Store, la idea es que en la respuesta recibida puede venir con un error http en la cabecera y en ese caso deseo enseñar un mensaje en función del código http, o bien puede llegar un error enviado por la lógica de negocio el cual vendría con status http 200 pero con un contenido XML que tiene como root el tag <error> y si eso sucede quiero enseñar también un mensaje, en el caso de que no ocurra ninguno de los supuestos no quiero alterar el comportamiento por defecto del store. El comportamiento descrito quiero usarlo para todos los Ext.data Store de mi aplicación. ¿Cual sería el camino correcto para implementarlo? Gracias anticipadas por vuestras ayudas
0
bueno si quieres aplicarlo para todos tus store lo mejor es que extiendas el store, o la sobreescribas o talvez un plugin, para que asi le asignes el comportamiento personalizado. suerte
0
He intentado sobrescribir el evento pero no lo consigo, incluyo el código de un pequeño intento:
    Ext.override(Ext.data.Store,{
        onLoad: function(store, r, o) {
				alert(o.status);
		}
    })
Pero el problema es que nunca veo el alert <!-- s:cry: --><!-- s:cry: -->
0
mmmm... lo que sucede es que el "onload" es un evento que para ponerle un listener lo haces mediante el método "component.[b]on(...)[/b]". Lo que te recomiendo es que hagas una "extensión" del store, algo así:
Ext.ux.TuStore = Ext.extend(Ext.data.Store,{
	initComponent: function(){		
		Ext.ux.TuStore.superclass.initComponent.apply(this, arguments);
		// tu código....
	}
});
dentro de esta extención implementar el evento "load" y luego en lugar de usar el store normal utilizas esta extensión.
var store = new Ext.ux.TuStore(...);
realmente nunca he hecho algo semejante (especificamente con el store, si he hecho esto con otros componentes), así que en teoría para agregar el listener lo puedes hacer algo así:
this.on(...)
prueba y nos cuentas <!-- s;) --><!-- s;) --> saludos PD: si tengo tiempo haré algo así, pues me ha quedado la duda jejejejeje
0
Gracias por los consejos. Se ve que el store debe ser un componenete un tanto peculiar, porque sigo sin conseguir "domarlo", os paso el codigo de lo que intento:
Ext.ux.xStore = Ext.extend(Ext.data.Store,{
        initComponent: function(){
            Ext.ux.xStore.superclass.initComponent.apply(this, arguments)
            this.on('load', function(){
                console.info('Evento!!')
                alert('evento load')
                
            })
        } //initComponent   
    }) //Ext.ux.xStore
Pero sigue sin funcionar, de echo lo he probado con el evento beforeload y tampoco <!-- s:cry: --><!-- s:cry: --> ¿Se os ocurre cual puede ser el problema?
0
Bueno finalmente hallé el modo, parece ser que para extender clases del tipo no-componente se debe usar la siguiente nomenclatura:
Ext.ux.xStore = Ext.extend(Ext.data.Store, {
    constructor: function(config){
        Ext.ux.xStore.superclass.constructor.call(this, config);
        this.on('load', function(){
            alert('evento load')
        })
        this.on('loadexception', function(){
            alert('evento loadException')
        })
    }// constructor
}) //Ext.ux.xStore
Nunca te acostarás sin saber una cosa más <!-- s:D --><!-- s:D -->
0
hola que tal jeje . entontre el detalle lo que pasa que al crearse un store, bueno como en si al parcecer no es un componente("en toda su definicion" {corrijanme si me equivoco por favor!!}), no utliza el evento initComponent en su construcción, si no que utiliza el envento cosntructor aqui te dejo como lo hice jeje
 AppPV.store= Ext.extend(Ext.data.JsonStore,{
        constructor: function(){   
        	// console.info('Evento!!'); 
        	AppPV.store.superclass.constructor.apply(this, arguments);
            this.on('load', function(){
                console.info('Evento!!');                           
            });       
        }
}); //initComponent
Wow!! hoy aprendi algo nuevo <!-- s8-) --><!-- s8-) --> Saludos y SuertEXtjs
0
jajaja orale bueno pues ya encontraste solucion !!! creo qeu en preciso momento de mi edicion tu estabas posteando la solucion bueno perfecto jeje saludos

¿Conoces a alguien que pueda responder esta pregunta? Comparte el link en Twitter o Facebook

Es necesario registrarse para poder participar en el foro! Si ya tienes una cuenta puedes entrar y comentar en este foro.