Como agregar eventos a botones de un objeto heredado
Hola buen día, cree un archivo .js siguiendo las indicaciones que hay aqui http://foro.quizzpot.com/discussion/837/como-incluir-un-formpanel-de-un-js-externo sin embargo, no se cómo agregar el evento click a cada uno de los botones, bueno lo que hice fue agregar este código:
this.fbar = {
xtype: 'toolbar',
items: [
{
xtype: 'button',
text: 'Guardar',
listeners :
{
'click': function(){
myVentanaFormulario.guardar();
}
}
},
{
xtype: 'button',
text: 'Cerrar',
listeners :
{
'click': function(){
myVentanaFormulario.hide();
}
}
}
]
};
En el primero botón la función la puse después de initComponent puse una coma al final de la llave y agregué:
guardar: function(){
alert("entre a guardar");
}
incluso lo puse asi:
this.guardar: function(){
alert("entre a guardar");
}
pero no funciona, en el caso del botón "Cerrar" puse this también y nada, aún cuando le pongo close, hide o destroy. Cómo puedo agregar eventos a los botones, que el primero llame a una función que hará el guardado y en el caso del Cerrar que cierre la ventana.
Saludos y Gracias
Tendrá algo que ver, la versión de Etxjs? tengo la 3.0, descargué la 3.3.1, sin embargo me generó muchos otros errores, tons ya no se si sea eso.
Saludos y Gracias
yo también tengo la 3.3.1, y me funciona bien.
por lo demos solo me arroja errores de logica donde deberías preguntar si lo seleccionado es undefined, pero nada mas
Tokaiddo, Yo tengo la versión 3.0, descargué la 3.3.1, y el simpleStore que tengo para la paginación del grid, me generó un error, de que SimpleStore no es un constructor
mmmmm, okidoki, creo que ya le entendí más a eso, hoy en la tarde lo pruebo y te comento que onda, gracias
Hola tokkaido, hice lo que comentaste del botón de poner ../btn_guardar y me sigue dando el mismo error. :(
Saludos y Gracias
Hola tokkaido, hice lo que comentaste del botón de poner ../btn_guardar y me sigue dando el mismo error. :(
Saludos y Gracias
Hola, gracias, me puedes explicar un poco más? los archivos que te pasé, todos están dentro de la misma carpeta y al mismo nivel. No entendí la parte de: "Por como tienes configurado tu formulario". ¿Cómo lo tengo? jajajaja
Saludos y Gracias
no se trata de los niveles de la carpeta, "es como si fueran niveles de carpetas". tu objeto btn_guardar, esta dentro del formulario, dentro de otro componente por eso para llamarlo por referencia necesitas "bajar" otro nivel, si en vez de un botón fuera un panel y dentro de ese panel tuvieras el botón entonces el ref seria: '../../btn_guardar'
Hola tokkaido, hice lo que me sugeriste, pero me generar un error, con el botón, me sale este error "this.btn_guardar is undefined"
Te pego el código.
Lo primero es crear la ventana el archivo es ventanaPreguntas
Luego creo la segunda parte que pusiste, el archivo es uiFrmPreguntas, y hay un tercer archivo, que es el que contiene el grid, que ahi es donde creo el objeto del tipo que está en uiFrmPreguntas. el archivo es frm_preguntas.
La línea donde se genera el error, es en el archivo uiFrmPreguntas. en esta:
this.btn_guardar.on('click', this.guardar, this)//podras hacer facilmente referencia a los componentes de tu ventana
me sale el error que comenté en la parte de arriba, si lo quito, si muestra bien la ventana. Qué estoy haciendo mal?
Saludos y gracias de antemano
por como tienes configurado tu formulario, el boton esta en un nivel inferior por lo que debes cambiar la ref del botón de ref: 'btn_guardar' a ref: '../btn_guardar'.
ojo con las comas sobrantes, yo uso Komodo que me avisa si tengo una coma demas
Hola tokkaido, muy interesante lo que me explicas, voy a intentar hacer lo que me comentas, muchas gracias. Por cierto sólo una pregunta más, en el último código me muestras cómo pasar el parámetro a la ventana, ahora, cómo lo recibo desde la ventana, por ejemplo. Yo tengo un viewport con un grid, y en el toolbar tengo varios botones (Agregar, Editar, Eliminar) Agregar y Editar usarán la misma ventana, sólo que mandaré un parámetro para determinar qué debe hacer el módulo, si insertao guardar.
Tons asi como lo explicas ya se cómo mandarlo, ahora, cómo lo recibo en la ventana?
Saludos y Gracias
en tu ventana basta con usar el parámetros así:
this.mi_parametro
importante es que cuando crees los listeners les envíes el this tambien asi:
this.btn_guardar.on('click', this.guardar, this)
suerte
Podrias pegar tu codigho completo para hacer una prueba pero asi a vuelo de pájaro me atrevería a decirte que con la función así :
guardar: function(){
alert("entre a guardar");
}
tal como dijiste despues del initComponent deberia funcionar llamandola de esta manera:
{
xtype: 'button',
text: 'Guardar',
listeners :
{
'click': this.guardar
}
}
prueba y cuentanos
Ahora bien te recomiendo trabajar de la sgte manera, parece más trabajo al principio pero te ayudará a separar las cosas porque yo siempre me enredaba con las funciones y los eventos (si buscas post mas antiguos mios aqui mismo veras que hay evidencia de eso :-D ), lo mejor es separar las interfaces de los eventos, es mucho mas transparente y fácil de modificar posteriormente. creas por ejemplo una ventana en un archivo llamado myventana.ui.js asi:
myVentanaUi = Ext.extend(Ext.Window, {
//todas la propiedades del componente que estoy expandiendo aqui
title: 'titulo de mi ventana',
width: 408,
height: 142,
layout: 'fit',
resizable: false,
modal: true,
constrain: true,
initComponent: function() {
//y aqui los items de mi componente/contenedor
//por ejemplo un formulario dentro de mi ventana
this.items = [
{
xtype: 'form',
padding: 10,
url: 'mi_formulario.php',//la url de la pagina que manejara la info que enviaras
ref: 'form',//referencia para usar despues IMPORTANTE!!!
items: [
{
xtype: 'textfield',
fieldLabel: 'Texto 1',
ref: '../text_1',//la referencia es como niveles dentro de una carpeta, este componente está en el subnivel "../" del componente que lo contiene
id: 'text_1'
}
]
}
];
//la barra de mi ventana
this.fbar = {
xtype: 'toolbar',
items: [
{
xtype: 'button',
text: 'Guardar',
iconCls: 'guardar',
ref: '../btn_guardar'//ahora referencias el boton pra usar esa referencia despues tambien
}
]
};
myVentanaUi.superclass.initComponent.call(this);
}
});
y luego creas otro archivo js donde instanciaras tu componente ventana de esta manera:
myVentana = Ext.extend(myVentanaUi, {
initComponent: function() {
myVentana.superclass.initComponent.call(this);
this.btn_guardar.on('click', this.guardar, this)//podras hacer facilmente referencia a los componentes de tu ventana
this.on('render', this.foco, this);//o a los eventos de la ventana en si
},
foco: function() {
this.text_1.focus(true,500);
},
guardar: function() {
this.form.getForm().submit({//o por ejemplo manejar el formulario que esta dentro por su referencia
params: {
parametro1: this.parametro //podras pasarle parametros adicionales
},
success: function(){
this.close();
},
failure: function(form, action){
Ext.MessageBox.show({
title: 'Error',
msg: 'Faltan datos!',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.ERROR
});
},
scope: this //IMPORTANTE para el this.close()
});
}
});
al que llamaras myventana.js
estos los colocaras en tu html en orden, por ejemplo:
como puedes ver yo prefiero separar en carpetas las interfaces de mis componentes de los eventos que las manejan, para el sistema es trasparente, es solo para ordenar mis archivos mas fácilmente.
Ahora recien utilizas tu componente en tu código final, una cosa así:
this.winNuevo = new myVentana();
this.winNuevo.parametro = 'agregar'; //este parámetro por ejemplo puedes pasarle a tu componente
this.winNuevo.show();
trabajar de esta manera te permitirá por ejemplo reutilizar tu codigo creando componentes personalizables a los cuales les pasaras las propiedades que quieras que tengan
espero te sea util
¿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.