2012-07-13 69 views
21

Tôi mới sử dụng plugin jquery DataTables. Sau khi phát hiện ra rằng IE 8 có vấn đề về hiệu suất với Javascript, tôi quyết định thay đổi cách tôi sử dụng DataTables để xử lý phía máy chủ. Tôi nhận được thông báo lỗi này khi tải JSP của tôi (Tôi đang sử dụng Spring 3):Lỗi DataTables: "Đã yêu cầu thông số không xác định"

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

Tôi đã google xung quanh và phát hiện ra rằng nhiều nguyên nhân đó thông báo lỗi đi xuống JSON bị thay đổi vì vậy tôi tìm thấy một cách để xuất JSON của tôi từ hàm điều khiển Spring 3 của tôi để xem JSON mà nó tạo ra và tôi đã thay đổi mã của mình để làm cho nó khá gần với trang DataTables nói nó trông giống như thế.

Vẫn không có niềm vui, vẫn nhận được thông báo lỗi đó.

Ví dụ về xử lý phía máy chủ mà tôi tìm thấy cho DataTables không bao gồm mã để chỉ định các cột được sử dụng ở phía máy khách, vì vậy tôi cho rằng tôi không cần nó. Tôi có?

Dưới đây là những phần liên quan của results.jsp tôi:

<!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> 

Đây là phản ứng JSON Tôi đã gửi cho nó:

{ 
    "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" 
    } ] 
} 

Đây là mùa xuân của tôi chức năng điều khiển Tôi đang sử dụng để gửi phản hồi JSON qua Jackson. Điều này bao gồm mã để xuất JSON của tôi để tôi có thể thấy nó trông như thế nào. JSON có thể xuất ra để stdout và những gì tôi gửi lại cho DataTables khác nhau không?

@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

Thông tin tại đây có thể giúp bạn .. http://stackoverflow.com/a/12985883/661584 Hy vọng bạn sẽ làm việc đó. Chrs – MemeDeveloper

Trả lời

13

Tôi gặp vấn đề tương tự vào sáng nay. Bạn cần có các tham số aoColumns và sử dụng mDataProp Như trong này:

https://gist.github.com/1660712

Ít nhất nó giải quyết vấn đề của tôi.

+0

Cảm ơn ví dụ! – Steve

35

Tôi cũng gặp phải cảnh báo tương tự, nhưng nguyên nhân khác. Tôi có các giá trị null trong dữ liệu của mình. Định dạng JSON là đúng, nhưng DataTables không biết có quy tắc mặc định để hiển thị nulls. Giải pháp là sử dụng thuộc tính sDefaultContent.

mẫu aaData:

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

Và sau đó trên aoColumns, bạn có thể sử dụng tài sản như sau:

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

Đây không phải là vấn đề hiện tại của bạn, nhưng bạn có thể gặp phải vấn đề này trong Tương lai.

Hy vọng điều này hữu ích.

+1

Cảm ơn! Điều đó đã giúp tôi. –

+0

cảm ơn bạn. Điều này giải quyết được vấn đề của tôi. Nó chỉ xảy ra trên v1.9. Đối với 1,8, datatable vẫn chạy tốt –

+0

Điều này giải quyết vấn đề của tôi. Cột đầu tiên trong bảng của tôi không được gắn với dữ liệu nhưng nó sẽ hiển thị một nút để chỉnh sửa bản ghi hiện tại. –

2

sDefaultTùy chọn nội dung chỉ ngăn hiển thị các hộp cảnh báo. Bảng dữ liệu không tìm thấy quy tắc để hiển thị giá trị null.

Thay đổi giá trị null trong bảng sẽ loại bỏ cảnh báo này ..

1

Nếu nó giúp mọi người tôi đã có một lỗi tương tự vì tôi đã có khoảng thời gian trong tên hàm mRender tôi:
My.Namespace.MyFunction(data, row);

dòng này:
var a = _fnSplitObjNotation(src);

Tách rằng thành các đối tượng riêng biệt, mà rõ ràng là tạo ra một lỗi.

Sử dụng

My_Namespace_MyFunction(data, row);

Ngoài ra tôi nhận thấy lỗi này khi đi qua một tên hàm chuỗi thay vì đối tượng hàm JavaScript.

1

Để tránh lỗi này, số bảng "cột" của bạn phải bằng cột dữ liệu trả về (theo số), trong vấn đề ở trên, đó là aaData.

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

Đây là định dạng đúng để trả về dữ liệu từ ngôn ngữ phía máy chủ. Tôi đã giải quyết được vấn đề của mình theo cách tương tự.

Các vấn đề liên quan