jquery DataTables插件:你能捕获插件所期望的JSON以外的服务器端数据吗?

时间:2011-01-25 21:10:31

标签: jquery datatables

我正在使用“bServerSide”:true,“sAjaxSource”:和“fnServerData”:...填充数据表。这工作正常。

 "bFilter": true,
"bSort": true, 
"bSortClasses": true, 
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "my_page_that_outputs_json.asp",

"fnServerData": function ( sSource, aoData, fnCallback ) {
    aoData.push( { "name": "my_custom_var"  , "value": $('#someCustomVar').val() } );                   
    $.getJSON( sSource, aoData, function (json) { 
        fnCallback(json);  
    } );
},

但是,当我调用服务器时,我希望从连接到服务器的页面返回的不仅仅是JSON。我有额外的记录集,我只想调用一次数据库,但是这可能在datatables框架内吗?当由数据表检索时,输出JSON的页面仅期望JSON,并且当存在任何其他元素时给出错误。

更新1:不知道这是否是正确的路线, 但我现在想的是一个选择是使用数据表 隐藏列功能。 http://www.datatables.net/examples/basic_init/hidden_columns.html 我想你可以在隐藏列的单个单元格中填充带有ID​​的元素, 然后通过jQuery访问ID的信息。

更新2:也许这就是父页面上其他元素的可行方式 从JSON响应页面中的元素更新(我也提出了这个 数据表论坛中的问题,没有回复):

  1. 为每个隐藏的输入添加并包含ID 在json数据的第一行

  2. 不要尝试隐藏列,因为元素似乎无法访问 当列被隐藏时。 (如果我对此有误,请有人告知......)

  3. 如果隐藏的输入只需要渲染一次,那么就这样做

  4. 通过父页面上的jQuery访问隐藏的输入

  5. 更新3: @ JM4 - 我不知道这会专门解决您的问题, 但我能够使用隐藏的输入路径 - 例如,<input type="hidden id="myCustomID_012" /> - 并完成我需要做的事情。

    我使用了类似下面的函数来处理行单击。 此函数不在dataTable构建中。

    function clickRowHandler() {
    /* Highlight selected row on single click */
    $('.tblIntrepid tbody tr').click(function(event) {
        $(oTable.fnSettings().aoData).each(function (){
            $(this.nTr).removeClass('row_selected');
        });
    
        // update the myIntrepidID value for form "complete" submission
                // myIntrepidID was already on the page, not in the dataTable
        var myNewIntrepidID = $(this).find("td:first input").val(); 
        $('#myIntrepidID').val(myNewIntrepidID); 
        // set the row class
        $(event.target.parentNode).toggleClass('row_selected');
        });
       /* more details */
      }
    

    在dataTable构建中,调用了clickRowHandler函数 这样:

    "fnDrawCallback": function() {
            clickRowHandler();
    },
    

    另外,我不记得在DataTables论坛中我在哪里看到过这个 (可能从这里开始:http://datatables.net/forums/comments.php?DiscussionID=3931) 但是你可以使用的另一条路线是输出超越json的数据 dataTables需要什么。所以,虽然你需要输出包含的json “sEcho”和“iTotalRecords”和“iTotalDisplayRecords”和“aaData”, 您也可以创建自己的名称/值对。

    如果您在选择下拉列表中有10个用户名列表 在表头中,您可以在该位置构建名称/值对 你构建你的json,并称之为“selectUserNames”。然后在你的 在dataTables构建中,您可以将该自定义json对象转换为列表 (我没有在这里显示所有功能):

    此功能在dataTables构建之外创建选择下拉列表。 // http://datatables.net/forums/comments.php?DiscussionID=3931&page=1#Item_6

    function fnCreateSelect( aData ) {
        var r='<select><option value=""></option>', i, iLen=aData.length;
        //alert(iLen); 
        for ( i=0 ; i<iLen ; i++ )
        {
            r += '<option value="'+aData[i]+'">'+aData[i]+'</option>';
        }
        return r+'</select>';
    }
    

    在dataTables内部构建......

      $.getJSON( sSource, aoData, function (json) { 
         if ( json.sEcho == 1 ) {
            $("thead td.search").each( function () {
    
    /* Insert the select menu */
    this.innerHTML = fnCreateSelect(json.selectUserNames);
    
    /* Add the event listener for the newly created element */
       $('select', this).change( function () {
         oTable.fnFilter( $(this).val(), 8 );
       });
    });
    

1 个答案:

答案 0 :(得分:0)

如果使用drawcallback将类添加到当前行(例如,添加选定的类),则可以检索隐藏值。

这是我的fnDrawCallback函数,它在当前行上添加'row_selected'类。仅当这是此类的唯一行时才有效。

"fnDrawCallback": function(){
  $('td').bind('mouseenter', function () { $(this).parent().addClass('row_selected').css('cursor', 'pointer'); });
  $('td').bind('mouseleave', function () { $(this).parent().removeClass('row_selected'); });
},

使用json填充表时的问题是所选节点的nodeName未定义。因此,您可以找到包含所选类

的行
$("#leadList tbody").click(function(event) {
  var aTrs = table.fnGetNodes();
  for ( var i=0 ; i<aTrs.length ; i++ ) {
    if ($(aTrs[i]).hasClass('row_selected') ) {
      // here you get the data without the need of fnGetPosition
      var aData = table.fnGetData( i );
      location.href='mylink/' + aData[0];
    }
  }
});