Foros del Web » Programando para Internet » Javascript »

Duda en construccion de prototipo

Estas en el tema de Duda en construccion de prototipo en el foro de Javascript en Foros del Web. Buenas tardes, tengo un problema que no alcanzo a solucionar, hace tiempo hice un programa para una liguilla de futbol y funciona bien, pero estoy ...
  #1 (permalink)  
Antiguo 17/12/2011, 09:50
 
Fecha de Ingreso: febrero-2010
Ubicación: Bizkaia
Mensajes: 22
Antigüedad: 14 años, 9 meses
Puntos: 0
Pregunta Duda en construccion de prototipo

Buenas tardes, tengo un problema que no alcanzo a solucionar, hace tiempo hice un programa para una liguilla de futbol y funciona bien, pero estoy intentando ampliarla para que puedan convivir varias ligas independientes.

Me he decidido por los objetos para aprovchar sus caracteristicas, pero como a todo el mundo que empieza hasta que va asimilando conceptos se vuelve loco con cosas que seguramente que entendiendolas sean faciles.

Lo que he leido sobre ello es bastante escueto y confuso, el caso es que me he clavado en conseguir despues de armar el prototipo e instanciarlo en las ligas necesarias, es que los datos vayan a parar donde yo quiero, cada uno a su liga, no se si me explico, esto es lo que tengo.

// EL PROTOTIPO
var Ligas = function (key,dat,equ,res,hor,cru,cons) {
this.key = new String(key);
this.dat = new String(dat);
this.equ = new String(equ);
this.res = new String(res);
this.hor = new String(hor);
this.cru = new String(cru);
this.cons = new String(cons);
this.datos = new Array();
this.init = init;
this.cargar_dat = cargar_dat;
}

// EL OBJETO
var liga_1 = new Ligas (
"clave",
"ods",
"odu",
"odv",
"oe5",
"ody",
""
);

// CARGO SCRIPT json-in-script y en el callback llama a cargar_dat

function init() {
cargaSRC (this.key, this.cons, this.dat, 'cargar_dat', function(){});
}

// llamo a init para cargar el script y este en el callback llame a cargar_dat

liga_1.init;


// LA FUNCION QUE SE ENCARGA DE RECIBIR LOS DATOS

function cargar_dat(json) {
try {
var datos2 = new Array ();
var entry = json.feed.entry[0];
datos2 = {eq:'',liga:'',tempo:'',tipo:'',grupo:'',idfvf:'', gloc:0,gvis:0,vloc:0,vvis:0,empt:0,nro:0};
datos2.eq = entry["gsx$eq"].$t;
datos2.liga = entry["gsx$lg"].$t;
datos2.tempo = entry["gsx$tp"].$t;
datos2.tipo = entry["gsx$t"].$t;
datos2.grupo = entry["gsx$gr"].$t;
datos2.idfvf = entry["gsx$id"].$t;
datos2.gloc = parseInt(entry["gsx$gl"].$t);
datos2.gvis = parseInt(entry["gsx$gv"].$t);
datos2.vloc = parseInt(entry["gsx$vl"].$t);
datos2.vvis = parseInt(entry["gsx$vv"].$t);
datos2.empt = parseInt(entry["gsx$e"].$t);
datos2.nro = parseInt(entry["gsx$ne"].$t);

this.datos = datos2;
}
catch(er) {
alert("Error en cargarDATOS");
}
} // fin cargar_dat

Lo que quiero saber es como debo de recuperar los datos para que me los almacene en el Array datos de su liga correspondiente, en este caso liga_1.

El problema es que a esta funcion no puedo pasarle parametros, ella devuelve el json.

He probado en el prototipo añadir despues de init la funcion de esta manera this.cargar_datos = cargar_datos; y en la funcion cargar_datos lo siguiente this.datos = datos2; para que me almacene los datos en liga_1.datos pero me lo almacena en window.datos.
¿ Que es lo que estoy haciendo mal para que no me lo reconozca this como liga_1 ?
Creo que en el objeto liga_1 deberia añadir alguna relacion con la funcion cargar_dat pero no se como.
Si alguno de vosotros me pudiese ayudar se lo agradeceria, me esta volviendo loco y todas la referencias que he mirado en internet son bastante confusas.
Un saludo.
  #2 (permalink)  
Antiguo 17/12/2011, 10:35
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Duda en construccion de prototipo

buenas...
hay varias cosas por explicar, pero vamos al principal. primero debes fijarte en lo que devuelve el contenido json. supongo que estas usando jsonp porque en la invocación le estas pasando un callback. el contenido seguramente te llegará el json envuelto en el callback. sucede que en tu script tienes definido en el ambiente global la función cargar_dat, y por eso los datos cargan en la propiedad window.datos. el callback no puede ser directamente dicha función, tienes que pasarle el nombre de la instancia -la variable- seguido del nombre del método que recibe los datos json. o sea, tienes que pasarle el string "liga_1.cargar_dat". sin embargo, nótese que el nombre de la instancias tienes que proveerla de acuerdo a la variable. de modo que si creas otra instancia en la variable "liga2", entonces debes indicar como callback "liga2.cargar_dat".

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 17/12/2011, 19:06
 
Fecha de Ingreso: febrero-2010
Ubicación: Bizkaia
Mensajes: 22
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Duda en construccion de prototipo

Muchas gracias ZeroKilled, me ha sorprendido la rapidez y como has entendido a la perfeccion el tema, ahora funciona esa parte como yo quiero, es decir sabe al recoger el json en que array lo tiene que almacenar y cada liga tiene sus datos separados.

Tengo duda en si tengo bien hecho la asignacion en la funcion cargar_dat como lo tengo hecho, es decir, crear un array (datos2) o directamente asignar campo por campo a liga_1.datos por ejemplo this.datos.eq = entry["gsx$eq"].$t; osea evitar el crear arrays para controlar recursos, aunque tambien me imagino que el array se destruye al finalizar la funcion, tengo esa duda.

Ahora el problema lo tengo en otro lado y no doy con ello.
Como yo recojo los datos mediante scripts de una hoja de calculo de google y los cargo dinamicamente si los necesito con funciones como CargaSRC que a su vez esta preparada para recoger una funcion callback (aparte de la que devuelve el jsonp), estas funciones son llamadas despues de cargar los scripts para asegurarse que los datos estan cargados, pero al tener varias ligas en los posts y el querer yo cargar dinamicamente segun necesite las ligas a veces tengo problemas de que al depender las tablas que dibujo de varios scripts se dibujan antes de cargar todos los datos y da errores.

He ideado una forma, despues de mirar y descartar loops de espera o funciones de espera que no me gustan como funcionan, que es la siguiente.

Al cargarse el blog con todos los post con sus tablas clasificatorias en vez de ejecutar las funciones las cargo en un array con esta funcion, que he añadido al prototipo y funciona perfecto.

function cargafuncion (funcion) {
try {
document.getElementById('cargando').style.visibili ty = 'visible';
this.cargas.anadir(funcion,false);
}
catch(er) {
alert("Error en cargafuncion");
}
} // fin cargafuncion

Osea carga todas las funciones como strings, recoge todas las funciones que llaman los post pero no se pueden ejecutar todavia por falta de datos al ser la carga de datos mas lenta.

En los post llamo a liga_1.cargafuncion('TablaClasif(liga_1,4)');

Cada liga sabe las funciones que tiene que ejecutar.

Por otro lado y es donde tengo problemas he añadido al prototipo la siguiente funcion

function ejecutar() {
try {
for( var i=0; i < this.cargas.length; i++ ) {
eval(this.cargas[i]);

}
document.getElementById('cargando').style.visibili ty = 'hidden';
}
catch(er) {
alert("Error en ejecutar");
}
} // fin ejecutar

y la llamo en la funcion siguiente

function init() {
cargaSRC (this.key, this.cons, this.dat, this.name+'.cargar_dat', function(){});
cargaSRC (this.key, this.cons, this.equ, this.name+'.cargar_equ', function(){});
cargaSRC (this.key, this.cons, this.hor, this.name+'.cargar_hor', function(){});
cargaSRC (this.key, this.cons, this.res, this.name+'.cargar_res', function(){this.ejecutar();});
}

(he añadido name para conocer el nombre liga_1 en este caso)

que es la que carga los scripts como callback, me aseguro que en el script ultimo que es el que mas datos tiene llame a this.ejecutar(), el problema es que me vuelve a a pasar lo mismo, no me reconoce this como liga_1 y da errores, tempoco en el prototipo la puedo llamar como liga_1.ejecutar porque solo me cargaria las funciones de liga_1, no se si queda claro el concepto.

Seguro que es una chorrada como lo otro, pero estoy probando todas las soluciones posibles y no consigo que ejecutar sepa que liga tiene que cargar y lo logico seria que con this se asignase.

Un saludo
  #4 (permalink)  
Antiguo 17/12/2011, 20:32
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: Duda en construccion de prototipo

Cita:
Tengo duda en si tengo bien hecho la asignacion en la funcion cargar_dat ... , aunque tambien me imagino que el array se destruye al finalizar la funcion, tengo esa duda.
primero, notese que aunque estas trabajando con un array, en realidad lo que estas haciendo es asignarle propiedades como si de un objeto normal se tratara. de todos modos, no creo que tenga tanta importancia. por supuesto, depende dependerá de como el resto de tu código maneje la propiedad datos porque al final lo que le estas asignando es un array. respecto a crear los campos uno a uno, dependerá mucho de tus afines. por ejemplo, fíjate que los nombres de las propiedades del json son distinto a los que estas creando en el array. además, parece que solo extraes varias propiedades y no todas. en fin, no hay porque preocuparse. lo que si pudistes haber hecho fue trabajar directamente con la propiedad datos de la instancia, pero igual no hay problema. dado que las variables datos2 y entry son locales a la función, automaticamente al final se destruyen. en realidad, hay otros factores adicionales que determinan cuando se destruye una variable, pero tu código parece no reflejarlo.

respecto al segundo problema. puede que mencione una chorrada; quizás deberías implementar el patrón observer. no puedo profundizar en el tema porque la verdad nunca lo he utilizado, ni siquiera sé si eso solucionaría dicho problema.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: json, objetos
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 19:46.