2012-07-13 17 views
21

Soy nuevo en el plugin jquery de DataTables. Después de descubrir que IE 8 tenía problemas de rendimiento con Javascript, decidí cambiar la forma en que uso DataTables para hacer el procesamiento del lado del servidor. Estoy recibiendo este mensaje de error cuando mis cargas JSP (estoy usando Spring 3):DataTables Error: "Parámetro desconocido solicitado"

DataTables warning (table id = 'results_table'): Requested unknown parameter '0' from the data source for row 0 

busqué en Google y encontré que muchas causas de ese mensaje de error que bajar a JSON malformación así que encontraron una manera de Salir de mi JSON desde mi función de controlador de Spring 3 para ver el JSON que hace y cambié mi código para que sea bastante similar a lo que el sitio DataTables dice que debería parecer.

Todavía no es un placer, sigue recibiendo ese mensaje de error.

Los ejemplos de procesamiento del lado del servidor que encontré para DataTables no incluían código para especificar las columnas utilizadas en el lado del cliente, así que supuse que no lo necesitaba. ¿Yo?

Estas son las partes pertinentes de mi results.jsp:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 

<head> 
    <title>ACME: search results in a nice DataTables.net Plugin</title> 
</head> 
<body> 

<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css" /> 
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery-1.7.js"></script> 
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery.dataTables.js"></script> 

<script type="text/javascript"> 
$(document).ready(function() { 
    $('#results_table').dataTable({ 
     "bProcessing": true, 
     "bServerSide": true, 
     "sScrollX": "600px", 
     "sServerMethod": "POST", 
     "sAjaxSource": "/acme/resultstable", 
    }); 
}); 
</script> 


<form id="command" name="f" action="employee" method="post"> 

    <div id = "results"> 
     <table id = "results_table"> 
      <thead>   
       <tr> 
        <th>&nbsp;</th> 
        <th>ID</th> 
        <th>NO_PRINT</th> 
        <th>Full Name</th> 
        <th>Email Address</th> 
        <th>Phone Number</th> 
        <th>Organization</th> 
        <th>Organization Code</th> 
        <th>Position</th> 
        <th>Employee Type</th> 
       </tr> 
      </thead> 
      <tbody>   
      </tbody> 
     </table> 

    </body> 
</html> 

Aquí es la respuesta JSON que he estado enviando a la misma:

{ 
    "sEcho" : 1, 
    "iTotalRecords" : 1, 
    "iTotalDisplayRecords" : 1, 
    "aaData" : [ { 
    "person_id" : "888888", 
    "ID" : "999999", 
    "no_print" : "&nbsp;", 
    "fullname" : "Obama, Willard", 
    "email_address" : "<a href = \"mailto:[email protected]\">[email protected]</a>", 
    "current_phone_number" : "303-867-5309", 
    "title" : "&nbsp;", 
    "office" : "&nbsp;", 
    "position" : "Contractor", 
    "empl_code" : "CONT" 
    } ] 
} 

Aquí está mi primavera función de controlador que estoy usando para enviar la respuesta JSON a través de Jackson. Esto incluye código para generar mi JSON para que pueda ver cómo se ve. ¿Podría el JSON generar salidas a stdout y lo que estoy enviando a DataTables será diferente?

@RequestMapping(value = "/resultstable", method = RequestMethod.POST) 
public @ResponseBody LinkedHashMap resultstable(ModelMap model,     
               HttpSession session, 
               @RequestParam (required=true) int sEcho, 
               @RequestParam (required=true) int iDisplayStart, 
               @RequestParam (required=true) int iDisplayLength,  
               @RequestParam (required=true) int iColumns, 
               @RequestParam (required=true) int iSortCol_0, 
               @RequestParam (required=false)String sSortDir_0, 
               @RequestParam (required=true) String sSearch) { 

    /* 
    ********************************************************************** 
    ** These come from the DataTables.net Jquery plugin on results.jsp 
    ********************************************************************** 
    ** sEcho,   - just send it back, used by DataTables for synching 
    ** iDisplayStart - index of the record to start with, ie 3 for the 3rd of 100 records 
    ** iDisplayLength - number of records to send back starting with iDisplayStart 
    ** iColumns  - number of columns to be displayed in the table 
    ** iSortCol_0  - the number of thee column to be sorted on 
    ** sSortDir_0  - direction of sorting: asc or desc 
    ** sSearch   - from the search box, filter results further on this term 
    ********************************************************************** 
    */ 

    String nextView     = "results"; 
    String usertype     = (String)session.getAttribute("usertype"); 
    Search search      = new Search(usertype); 
    List<LinkedHashMap> records  = null; 
    String results     = null; 
    int number_of_records    = (Integer)session.getAttribute("number_of_records_found"); 
    ResultsView rv     = new ResultsView(); 
    ResultsScreenTableHolder rstrh = null; 
    SearchScreenDataHolder ssdh2  = (SearchScreenDataHolder)session.getAttribute("search_screen_data_holder"); 
    ObjectMapper mapper    = new ObjectMapper(); 

    logger.debug("started"); 

    logger.debug("sEcho,   == " + sEcho  ); 
    logger.debug("iDisplayStart == " + iDisplayStart ); 
    logger.debug("iDisplayLength == " + iDisplayLength); 
    logger.debug("iColumns  == " + iColumns  ); 
    logger.debug("iSortCol_0  == " + iSortCol_0 ); 
    logger.debug("sSortDir_0  == " + sSortDir_0 ); 
    logger.debug("sSearch  == " + sSearch  ); 


    try { 
     records = search.searchForAnEmployee(ssdh2,usertype,sSearch,"asc", 
              iSortCol_0,iDisplayStart, 
              iDisplayLength);  


     LinkedHashMap lhm= new java.util.LinkedHashMap(); 
     lhm.put("sEcho", sEcho); 
     lhm.put("iTotalRecords",number_of_records); 
     lhm.put("iTotalDisplayRecords",9); 
     lhm.put("aaData",records); 

     // convert user object to json string, and save to a file 
     mapper.writeValue(new File("c:\\Downloads\\rstrh.json.txt"), lhm); 

     // display to console 
     logger.debug("My JSON: " + mapper.defaultPrettyPrintingWriter().writeValueAsString(lhm)); 

    } 
    catch (Exception e) { 
     logger.debug("\n",e); 
    } 

    return lhm;  

}// end function 
+0

información aquí podría ayudarle .. http://stackoverflow.com/a/12985883/661584 Espero que trabajar sobre eso. Chrs – MemeDeveloper

Respuesta

13

Estaba teniendo el mismo problema esta mañana. Es necesario tener el parámetro aoColumns y utilizar mDataProp Como en esto:

https://gist.github.com/1660712

Al menos resuelto mi problema.

+0

¡Gracias por el ejemplo! – Steve

35

Encontré la misma advertencia también, pero la causa era diferente. Tenía null valores en mis datos. El formato JSON era correcto, pero DataTables no sabe que tiene una regla predeterminada para mostrar nulls. La solución fue usar la propiedad sDefaultContent.

aaData muestra:

aaData: [ 
    { "Field1": "Foo", "Field2":null }, 
    { "Field1": "Bar", "Field2":null }, 
] 

y luego en el aoColumns, puede utilizar la propiedad como sigue:

aoColumns: [ 
    { "mData": "Field1", sDefaultContent: "n/a" }, 
    { "mData": "Field2", sDefaultContent: "" } 
] 

Ésta no es su problema actual, pero es posible que surja este problema en el futuro.

Espero que haya sido útil.

+1

¡Gracias! Eso me ayudó. –

+0

gracias. Esto resolvió mi problema. Solo ocurre en v1.9. Para 1.8, datatable sigue funcionando bien –

+0

Esto resolvió mi problema. La primera columna de mi tabla no está vinculada a los datos, pero muestra un botón para editar el registro actual. –

2

La opción sDefaultContent impide mostrar únicamente cuadros de alerta. Las tablas de datos no encontrarán la regla para mostrar valores nulos.

Al cambiar los valores nulos en la tabla se eliminará esta advertencia.

1

Si se ayuda a alguien que tenía un error similar porque tenía períodos en mi mRender nombre de la función:
My.Namespace.MyFunction(data, row);

Esta línea:
var a = _fnSplitObjNotation(src);

Splits que en objetos separados, lo que obviamente genera una error.

Usando

My_Namespace_MyFunction(data, row);

Además me di cuenta de este error cuando se pasa un nombre de función de cadena en lugar del objeto función de JavaScript.

1

Para evitar este error, el número de la tabla de "th" columnas debe ser igual a la devolución de las columnas de datos (en números), en el problema anterior se trata de aaData.

"aaData" : [ 
    [ 
    "person_id" : "888888", 
    "ID" : "999999", 
    ], 
    [ 
    "person_id" : "8888889", 
    "ID" : "9999990", 
    ] 
] 

Este es el formato correcto para devolver datos del idioma del lado del servidor. He resuelto mi problema de la misma manera.

Cuestiones relacionadas