entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Elegir qué datos mostrar en jQuery mobile usando Javascript

Soy nuevo en esto de escribir código. Estoy desarrollando un proyecto de webapp y me decidí a usar jQuery mobile. Buscando en internet me fui orientando para ir escribiendo el código, mucho a prueba y error modificando diferentes parámetros.
A duras penas pude armar un pequeño proyecto pero estoy estancado en un paso, que considero será fácil para responder de alguien que entienda del tema.

Mi webapp consiste de 2 páginas, usé el multipage de jQuery mobile para tener ambas páginas en un solo .html diferenciadas con sus respectivas id. En la primera página muestro una búsqueda que se autocompleta a medida que el usuario va tecleando mediante el uso de data-filter="true" para hacer de todo más sencillo.
La lista se autogenera con Javascript. Cuando el usuario selecciona el item que desea se carga la segunda página (#resultado) y ésta se llena de los datos correspondientes.

Hasta ahí todo perfecto. Mi pregunta es la siguiente (perdón por la larga introducción)
¿Cómo puedo hacer para elegir qué datos mostrar? Porque el código que tengo hasta ahora me devuelve la página #resultado con una lista de todos los valores correspondientes al item seleccionado.
Lo que me gustaría hacer es poder formatear estos valores con diferentes colores y demás orden.

Pego a continuación el código javascript que estoy utilizando:

$(document).on("pageinit", "#inicio", function () {

    var li = "";
    $.each(info, function (i, valor) {
        li += '<li><a href="#" id="' + i + '" class="info-go" data-transition="slide"><img src="img/'+ valor.foto +'"><h2><i>' + valor.cientifico + '</i></h2><p><b>Familia:</b> <i>'+ valor.familia +'</i> | <b>Subfamilia:</b> <i>'+ valor.subfamilia +'</i></p></a></li>';
    });

    $("#lista").append(li).promise().done(function () {
        $(this).on("click", ".info-go", function (e) {
            e.preventDefault();
            $("#resultado").data("info", info[this.id]);
            $.mobile.changePage("#resultado");
        });

        $(this).listview("refresh");
    });
});

$(document).on("pagebeforeshow", "#resultado", function () {

    var info = $(this).data("info");
    var info_view = "";
    for (var key in info) {
        info_view += '<div class="ui-grid-a"><div class="ui-block-a"><div class="ui-bar field" style="font-weight : bold; text-align: left;">' + key + '</div></div><div class="ui-block-b"><div class="ui-bar value" style="width : 75%">' + info[key] + '</div></div></div>';
    }
    $(this).find("[data-role=content]").html(info_view);
});

Como ven correctamente pude devolver los valores que yo quiero en la primera instancia de la página #inicio. Esto lo logré con el código valor.(clave) que pueden ver.
Lo usé en ese caso para poner la imagen correspondiente, algunos datos, etc.

La segunda parte, si bien tiene formato, me devuelve todos los datos en diferentes renglones. Lo que yo quiero es poder elegir donde poner X valor para ponerle negrita. (como hice antes con valor.foto para insertar la foto en la lista)

Espero se entienda, me enredo mucho tratando de explicar y ésto se debe a que recién estoy aprendiendo.

Muchas gracias por tu tiempo!

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola mats,

si no entiendo mal tu código (la porción que dejás, sin el resto, no permite hacerla funcionar para hacer pruebas) tendrías que hacer que el ID del elemento seleccionado en la paǵina #inicio sea accesible por el código que maneja #resultado para ahí poder seleccionar qué mostrar.

Asumiento que info es quien tiene todos los valores, podrías definir una variable actual de ámbito global a estas funciones y hacer por ejemplo

...
e.preventDefault();
$("#resultado").data("info", info[this.id]);
actual = this.id;
$.mobile.changePage("#resultado");
...

y luego en el código que muestra #resultado

$(document).on("pagebeforeshow", "#resultado", function () {
    var info = $(this).data("info");
    var info_view = "";
    var elSeleccionado = info[actual];
...

con lo que la variable elSeleccionado será quien tenga los datos del elemento que te interesa. Luego para mostrarlo, debés generar el HTML que quieras en invocar los valores

info_view += '<b>'+elSeleccionado.id+'</b>';

para ver el ID en negrita y así para todos los atributos que quieras mostrar.

Recordá definir la variable actual fuera de toda función, para que su valor esté accesible en las otras funciones.

Saludos!

0voto

mats comentado

Antes que nada te agradezco la pronta respuesta, y tu explicación. Me enriqueció en esto del uso de javascript bastante. Ahora, lo que no logro es cómo definir la variable actual que me sugieres usar fuera de toda función.
Probé poniendo var actual = ""; al principio de todo (para que esté fuera de toda función) y también probé con var actual; simplemente pero no funciona.
¿Cómo debo proceder? Tal vez lo estoy colocando mal.
Por otro lado, te comento que el código que estoy utilizando no es de mi autoría. Podés ver el código funcionando en (http://jsfiddle.net/hungerpain/52Haa/) en su versión cruda. Yo modifiqué parte adaptándolo para lo que necesito.

Ahí podrás ver cuál es el resultado que arroja la segunda página (la lista de todos los datos de ese ítem seleccionado, en ese caso de la persona elegida) y mi idea es como expliqué anteriormente, poner algún dato en negrita, colocar una foto, etc.

Infinitas gracias! Estoy con todas las energías de seguir aprendiendo.

0voto

mats comentado

Me dí cuenta que al reemplazar la parte del código var elSeleccionado = info[actual]; no borré el } final.
Ahora lo que me pasa es que queda colgada la página y la consola de Chrome me dice

Uncaught ReferenceError: actual is not defined

Así que si bien me di cuenta de un error, me generó basícamente el mismo. No puedo definir actual :S

0voto

Leonardo-Tadei comentado

Hola Mats,

la variable actual definida afuera de las funciones no es visible por un problema de ámbito de las funciones anónimas :-(

Igual, gracias al enlace del código funcional que pusiste, podemos ver otras opciones. En el código original, la función pagebeforeshow es disparada en el evento click y está implementada en una función anónima. Pues bien, la asignación del click está en pageinit y la asignación está dentro de una función anónima adentro de otra función anónima, por eso el sacar el valor del elemento seleccionado fuera no funciona, salvo que declares las funciones explícitamente.

Tu problema tiene sin embargo una solución más simple. Fijate que en el pagebeforeshow se hace la asignación var info = $(this).data("info"); en dónde $(this) es la función anónima llamadora y por tanto info ya tiene el elemento del JSON con los datos.

Luego, el bucle for (var key in info) lo recorre como un vector y muestra toda las claves, to tomarán sucesivamente sus valores en la variable key y entonces muestra el elemento que se corresponde con la clave, que es info[key] haciendo el código independiente de la definión del array que contiene los datos.

En este punto, si vos querés mostrar una clave determinada y que es conocida, simplemente podés invocarla directamente por el nombre de su clave e irla formateando, sin usar un bucle:

...
info_view += '<b>Nombre:</b> ' + info['name'] + '<br>Trabaja en: ' + info['company'];
...

y así ir mostrando el datos que quieras de la forma que quieras.

Resumiendo: no uses el bucle y escribí vos qué valores mostrar y cómo mostrarlos definiendo la variable info_view

Saludos!

0voto

mats comentado

Excelente! Eso era JUSTAMENTE lo que quería. No puedo estar más agradecido con el tiempo que me dedicaste para explicarme todo. Ciertamente probé con esa opción antes y no me resultaba, simplemente porque no utilizaba los nombres de los valores encerrados en ' ' como pusiste en el ejemplo que me daste. Me di cuenta porque pusiste el valor company sin los ' ' y no funcionó.
En fin, INFINITAS GRACIAS! Hiciste mi día :D

0voto

Leonardo-Tadei comentado

Por nada @mats!

Si te parece, marcá la respuesta como "seleccionada" así el tema queda cerrado y los que consultes cuestiones similares, ya saben que acá hay una respuesta posible.

Saludos!

PD: edito el código anterior para que funcione por mi olvido de las comillas porque la gente no suele leer hasta el final.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta