2

Busco la forma de mostrar un child.rows pero de la unica forma que se puede mostrar es con un returndirecto. entonces hice este codigo para que por fuera del ajax me tome esos valores pero no me da, espero que me puedan ayudar.
CODIGO

        function format (data) {
         $.ajax({
           url: "list_data",
           type: 'POST', 
           data: {'data':data[0]}, 
           success: function (result){
             for (var i = result.length - 1; i >= 0; i--){ 
               var resultado =  '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
                '<tr>'+
                  '<td>Full name:result[i].nombre</td>'+
                  '<td></td>'+
                '</tr>'+
               '</table>';
             }
             return resultado;
           }
         });
        }


return resultado; esto es lo que pienso que esta malo, y como ven necesito retornar ese codigo dentro del for y si hago el return dentro del for no funciona tiene que ser fuera del metodo ajax.

$('#example tbody').on('click', 'td.details-control', function () {
    var tr = $(this).closest('tr');
    var row = table.row( tr );

    if ( row.child.isShown() ) {
        // This row is already open - close it
        row.child.hide();
        tr.removeClass('shown');
    }
    else {
        // Open this row
        row.child( format(row.data()) ).show();
        tr.addClass('shown');
    }
} );
JDavid
  • 1,396
  • 7
  • 22
  • 46

1 Answers1

3

Por su naturaleza asíncrona, no puedes hacer que tu función retorne un valor desde el success de ajax; tienes que manejarlo dentro del success.

Puedes hacerlo, por ejemplo, de la siguiente forma:

// Se agrega el parámetro "callback", que debe ser una función
function format (data, callback) {
    $.ajax({
        url: "list_data",
        type: 'POST', 
        data: {'data':data[0]}, 
        success: function (result){
            for (var i = result.length - 1; i >= 0; i--){ 
                var resultado =  '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
                    '<tr>'+
                    '<td>Full name:result[i].nombre</td>'+
                    '<td></td>'+
                    '</tr>'+
                    '</table>';
            }
            // Tras obtener tu resultado, ejecutas la función recibida
            // como parámetro, con "resultado" como argumento
            callback(resultado);
        }
    });
}

Y en tu código principal, llamas a tu función format así:

$('#example tbody').on('click', 'td.details-control', function () {
    var tr = $(this).closest('tr');
    var row = table.row( tr );

    if ( row.child.isShown() ) {
        // This row is already open - close it
        row.child.hide();
        tr.removeClass('shown');
    }
    else {
        // Open this row
        format(row.data(), function(resultado){
            // "resultado" contiene la cadena que necesitas retornar
            row.child(resultado).show();
            tr.addClass('shown');
        });
    }
} );
  • el ultimo trozo de codigo debo de insertarlo en esta funcion.. row.child( format(row.data())).show(); tr.addClass('shown');he tratado muchas formas y no me funciona sabes depronto de que manera? – JDavid Jan 20 '17 at 21:53
  • @Daniel ¿Puedes editar tu pregunta y agregar el código donde llamas a la función `format`? ¿Eso lo llamas dentro de otra función, o cómo? – Rodrigo Salgado Atala Jan 20 '17 at 22:52
  • listo voy a editarla – JDavid Jan 22 '17 at 04:37
  • @Daniel Actualicé mi respuesta con la forma en que deberías llamar a la función `format` para obtener el resultado. – Rodrigo Salgado Atala Jan 23 '17 at 14:15
  • Te agradezco mucho el codigo funciona bien,solo hay un pequeño problema y es el ciclo for, el cual no funciona, solamente trae un solo dato. – JDavid Jan 23 '17 at 15:19
  • @Daniel El ciclo `for` es independiente de tu pregunta (cómo retornar el resultado de una llamada ajax). Si hay algún problema en el ciclo, puede tener que ver con los datos que tienes o con el código en ese ciclo en particular. Recuerda que en este sitio cada pregunta es una sola pregunta (valga la redundancia); si no logras resolver el problema con el ciclo `for` y quieres preguntarlo en este sitio, haz una nueva pregunta con tu nuevo problema. – Rodrigo Salgado Atala Jan 23 '17 at 15:28
  • listo @Rodrigo Salgado Atala igualmente te agradezco por la ayuda el codigo me ha servido de la manera que requeria. – JDavid Jan 23 '17 at 15:31