Foros del Web » Programando para Internet » Javascript » Frameworks JS »

objeto con sintaxis Json + asignacion de eventos con this

Estas en el tema de objeto con sintaxis Json + asignacion de eventos con this en el foro de Frameworks JS en Foros del Web. Tengo un problema al "instanciar" un objeto con la sintaxis Json. Resulta que no estoy pudiendo asignarle eventos usando this como variable. Es decir, esto ...
  #1 (permalink)  
Antiguo 21/12/2011, 17:46
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 8 años, 11 meses
Puntos: 101
objeto con sintaxis Json + asignacion de eventos con this

Tengo un problema al "instanciar" un objeto con la sintaxis Json. Resulta que no estoy pudiendo asignarle eventos usando this como variable. Es decir, esto no funciona:

this.tab.click( this.show );

El codigo un poco más completo es este:

Código Javascript:
Ver original
  1. sidebox = {
  2.     me : null,
  3.     closeBtn : null,
  4.     visible : false,
  5.     tab : null,
  6.     init : function(boxName){
  7.        
  8.         this.me = j('#'+boxName+'-sidebox');
  9.         this.closeBtn = j('#'+boxName+'-pane .sidebox-close');
  10.         this.tab = j('#'+boxName+'-tab');
  11.      
  12.         this.me.css("top", windowsHeight / 3 ); // vertical position
  13.      
  14.         this.tab.bind("click", this.show );  // show
  15.         this.closeBtn.bind("click", this.hide ); // hide
  16.     },
  17.     show : function(){
  18.     ....
  19.     },
  20.     hide : function(){
  21.      .....
  22.      }
  23. }

Código Javascript:
Ver original
  1. visionBox = new sidebox["init"]("vision");
  2.     missionBox = new sidebox["init"]("mission");

Como ven, tiene algo de jQuery. Pero más alla de eso, lo que está pasandome es que this.tab y this.closeBtn no se dan por enterados de que se les adjudica eventos. Por qué?

La parte que no funciona puntualmente es esta: this.show y this.hide. O sea, el selector si funciona, pero no la llamada al evento. Y yo creo que lo que esta pasando es que mis objetos no estas "heredando" los metodos: solo heredan las propiedades.

Última edición por mayid; 21/12/2011 a las 17:52
  #2 (permalink)  
Antiguo 21/12/2011, 18:49
Avatar de Dnielf  
Fecha de Ingreso: diciembre-2008
Ubicación: 127.0.0.1
Mensajes: 72
Antigüedad: 9 años, 2 meses
Puntos: 14
Respuesta: objeto con sintaxis Json + asignacion de eventos con this

En primer lugar no puedes usar el constructor new con notación literal de objetos, el navegador lo ignora, ahora con sidebox["init"]("vision") solo llamas a la función, un truco para que visionBox se vuelva "objeto" sería retornar la notación literal agregando return this al final del método init. :

http://jsfiddle.net/dnielF/fgN5v/1/

Saludos.

Última edición por Dnielf; 21/12/2011 a las 18:54
  #3 (permalink)  
Antiguo 21/12/2011, 19:01
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 8 años, 11 meses
Puntos: 101
Respuesta: objeto con sintaxis Json + asignacion de eventos con this

Cita:
Iniciado por Dnielf Ver Mensaje
En primer lugar no puedes usar el constructor new con notación literal de objetos, el navegador lo ignora, ahora con sidebox["init"]("vision") solo llamas a la función, un truco para que visionBox se vuelva "objeto" sería retornar la notación literal agregando return this al final del método init. :

http://jsfiddle.net/dnielF/fgN5v/1/

Saludos.
Ah... buen truco. Mil gracias!! Si me funciona. Aunque no entiendo bien la teoría. La idea es que el metodo "constructor" devuelve el objeto, verdad?

En el contructor funciona ok la asignación de eventos con this. Lo que veo que no marcha es el uso de this.me en el metodo show. Mira:

Código Javascript:
Ver original
  1. show : function(){
  2.         alert( this.me );
  3.     }
http://jsfiddle.net/fgN5v/2/

No se, es raro, porque si imprimo visionBox en la consola de firebug, veo que visionBox.me esta bien definido. Si llamo a visionBox.me tambien la cosa va bien. Peero... dentro de show() tengo que usar la variable this y eso no me esta funcionando.

En fin, me darías otro empujon?

Ps: "objeto literal" es un objeto con notación Json?
  #4 (permalink)  
Antiguo 21/12/2011, 19:20
Avatar de Dnielf  
Fecha de Ingreso: diciembre-2008
Ubicación: 127.0.0.1
Mensajes: 72
Antigüedad: 9 años, 2 meses
Puntos: 14
Respuesta: objeto con sintaxis Json + asignacion de eventos con this

Es divertido porque bind crea su propio ámbito, entonces si te das cuenta estarías haciendo esto :

Código:
this.tab.bind("click", function(){
 this.me; // En este ámbito this se refiere al tab y no la objeto principal.
});
Lo solucionarías pasando un argumento a la función.

PD: JSON es parte de la notación literal de objetos. Recomiendo esta pregunta : http://stackoverflow.com/questions/5179271/javascript-constructors-using-javascript-object-literal-notation
  #5 (permalink)  
Antiguo 21/12/2011, 20:20
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 8 años, 11 meses
Puntos: 101
Respuesta: objeto con sintaxis Json + asignacion de eventos con this

Gracias. Voy a leer mas sobre estos temas. Y decidir como reconstruir el objeto antes planteado.

EDITADO:
estuve viendo que esto pasa el objeto "prototypo" por referencia:
Código Javascript:
Ver original
  1. this.tab.bind("click", {obj: this}, this.show );  // show
  2.         this.closeBtn.bind("click", {obj: this}, this.hide ); // hide

Consecuentemente, al obtener el objeto por parametro de show & hide lo que obtengo en realidad es siempre el ultimo objeto instanciado:

Código Javascript:
Ver original
  1. show : function(event){
  2.        
  3.          obj = event.data.obj; // sidebox
  4. ...}

Esto es porque el this del constructor se refiere al objeto original, sidebox, y no a los que quiero instanciar. :\

Última edición por mayid; 22/12/2011 a las 08:43

Etiquetas: asignacion, eventos, funcion, jquery, js, json, objeto, sintaxis
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:21.