2016-12-13 50 views
0

我在使用Gyrocode示例創建的表格中遇到了一些問題。我修改它以通過ajax獲取和提交數據,並利用Datatables服務器端處理。提交表單重新提交相同的數據

基本上發生了什麼是我可以選擇row1並提交表單,一切工作正常。然後我取消選擇row1並選擇row2,當我提交時,它將提交row1 & row2。

我已經創建了一個JSFiddle來複制,並將表單變量記錄到控制檯。

第一步:選擇ROW1,並點擊「請求而選擇」按鈕,這裏是輸出

<form id="frm-example"> 
    <div class="table-responsive">...</div> 
    <input type="hidden" name="id[]" value="1"> 
</form> 

第二步:沒有刷新頁面,取消選擇ROW1,選擇2行,並點擊「請求來選擇'按鈕,這裏是輸出。你可以看到第一行仍然在變量中。

<form id="frm-example"> 
    <div class="table-responsive">...</div> 
    <input type="hidden" name="id[]" value="1"> 
    <input type="hidden" name="id[]" value="2"> 
</form> 

我嘗試清除表單變量,當請求成功發佈但它似乎回來。我不確定如何取消選擇所有內容,並在已經提交請求時將變量重置爲null。

HTML:

<div class="row"> 
    <div class="col-lg-12"> 
    <div class="row"> 
     <div class="col-lg-12"> 
     <!-- /.panel-heading --> 
     <div class="panel-body"> 
      <form id="frm-example"> 
      <div class="table-responsive"> 
       <div class="row"> 
       <div class="col-lg-12" style="padding-bottom: 5px;"> 
        <button id="btn-submit" class="btn btn-success" disabled><i class="fa fa-floppy-o"></i> Request Selected (0)</button> 
       </div> 
       </div> 
       <div class="table-responsive"> 
       <table class="display select table table-striped table-bordered table-hover" id="example"> 
        <thead> 
        <tr> 
         <th> 
         <input name="select_all" value="1" type="checkbox"> 
         </th> 
         <th>Name</th> 
         <th>Position</th> 
         <th>Office</th> 
         <th>Extn.</th> 
         <th>Start date</th> 
         <th>Salary</th> 
        </tr> 
        </thead> 
       </table> 
      </form> 
      </div> 
      </div> 
     </div> 
     </div> 
    </div> 
    </div> 

的Javascript:

// 
// Updates "Select all" control in a data table 
// 
function updateDataTableSelectAllCtrl(table) { 
    var $table = table.table().node(); 
    var $chkbox_all = $('tbody input[type="checkbox"]', $table); 
    var $chkbox_checked = $('tbody input[type="checkbox"]:checked', $table); 
    var chkbox_select_all = $('thead input[name="select_all"]', $table).get(0); 


    // If none of the checkboxes are checked 
    if ($chkbox_checked.length === 0) { 
     chkbox_select_all.checked = false; 
     if ('indeterminate' in chkbox_select_all) { 
      chkbox_select_all.indeterminate = false; 
     } 

     // If all of the checkboxes are checked 
    } else if ($chkbox_checked.length === $chkbox_all.length) { 
     chkbox_select_all.checked = true; 
     if ('indeterminate' in chkbox_select_all) { 
      chkbox_select_all.indeterminate = false; 
     } 

     // If some of the checkboxes are checked 
    } else { 
     chkbox_select_all.checked = true; 
     if ('indeterminate' in chkbox_select_all) { 
      chkbox_select_all.indeterminate = true; 
     } 
    } 
} 

$(document).ready(function() { 
    // Array holding selected row IDs 
    var rows_selected = []; 
    var table = $('#example').DataTable({ 
     'processing': true, 
     'serverSide': true, 
     'sAjaxSource': 'data.php', 
     'columnDefs': [{ 
      'targets': 0, 
      'searchable': false, 
      'orderable': false, 
      'width': '1%', 
      'className': 'dt-body-center', 
      'render': function(data, type, full, meta) { 
       return '<input type="checkbox">'; 
      } 
     }], 
     'order': [ 
      [1, 'asc'] 
     ], 
     'rowCallback': function(row, data, dataIndex) { 
      // Get row ID 
      var rowId = data[0]; 

      // If row ID is in the list of selected row IDs 
      if ($.inArray(rowId, rows_selected) !== -1) { 
       $(row).find('input[type="checkbox"]').prop('checked', true); 
       $(row).addClass('selected'); 
      } 
     } 

    }); 

    setInterval(function test() { 

     table.ajax.reload(null, false); // user paging is not reset on reload 
     $(".dataTables_processing").hide(); 
    }, 2000); 


    // Handle click on checkbox 
    $('#example tbody').on('click', 'input[type="checkbox"]', function(e) { 
     var $row = $(this).closest('tr'); 

     // Get row data 
     var data = table.row($row).data(); 

     // Get row ID 
     var rowId = data[0]; 

     // Determine whether row ID is in the list of selected row IDs 
     var index = $.inArray(rowId, rows_selected); 

     // If checkbox is checked and row ID is not in list of selected row IDs 
     if (this.checked && index === -1) { 
      rows_selected.push(rowId); 

      // Otherwise, if checkbox is not checked and row ID is in list of selected row IDs 
     } else if (!this.checked && index !== -1) { 
      rows_selected.splice(index, 1); 
     } 


     if (this.checked) { 
      $row.addClass('selected'); 
      document.getElementById("btn-submit").innerHTML = '<i class="fa fa-floppy-o"></i>' + " Request Selected (" + rows_selected.length + ")"; 
     } else { 
      $row.removeClass('selected'); 
      document.getElementById("btn-submit").innerHTML = '<i class="fa fa-floppy-o"></i>' + " Request Selected (" + rows_selected.length + ")"; 
     } 

     // Update state of "Select all" control 
     updateDataTableSelectAllCtrl(table); 

     $('#btn-submit').prop('disabled', (!rows_selected.length)); 

     // Prevent click event from propagating to parent 
     e.stopPropagation(); 
    }); 

    // Handle click on table cells with checkboxes 
    $('#example').on('click', 'tbody td, thead th:first-child', function(e) { 
     $(this).parent().find('input[type="checkbox"]').trigger('click'); 
    }); 

    // Handle click on "Select all" control 
    $('thead input[name="select_all"]', table.table().container()).on('click', function(e) { 
     if (this.checked) { 
      $('#example tbody input[type="checkbox"]:not(:checked)').trigger('click'); 
     } else { 
      $('#example tbody input[type="checkbox"]:checked').trigger('click'); 
     } 

     // Prevent click event from propagating to parent 
     e.stopPropagation(); 
    }); 

    // Handle table draw event 
    table.on('draw', function() { 
     // Update state of "Select all" control 
     updateDataTableSelectAllCtrl(table); 
    }); 

    // Handle form submission event 

    $('#frm-example').on('submit', function(e) { 
     if (!e.isDefaultPrevented()) { 
      var url = "process.php"; 
      var form = this; 

      // Iterate over all selected checkboxes 
      $.each(rows_selected, function(index, rowId) { 
       // Create a hidden element 
       $(form).append(
        $('<input>') 
        .attr('type', 'hidden') 
        .attr('name', 'id[]') 
        .val(rowId) 
       ); 
      }); 
      $.ajax({ 
       type: "POST", 
       url: url, 
       data: $(this).serialize(), 
       success: function(data) { 
        console.log(form); 

       } 
      }); 
      return false; 
     } 
    }) 

}); 
+1

爲什麼你不做一個更小的演示怎麼回事?這樣做你可能會自己發現問題。 –

+0

@LayTaylor我會嘗試,但所有的JS都需要選擇才能在數據表中運行。 – solar411

回答

0

我想通了!在我從ajax獲得成功後,我最終遍歷了選定的行並從表單變量中刪除了元素。

$('#frm-example').on('submit', function (e) { 
     if (!e.isDefaultPrevented()) { 
      var url = "process.php"; 
      form = this; 

        // Iterate over all selected checkboxes 
        $.each(rows_selected, function(index, rowId){ 
        // Create a hidden element 
        $(form).append(
         $('<input>') 
          .attr('type', 'hidden') 
          .attr('name', 'id[]') 
          .val(rowId) 
        ); 
        }); 
      $.ajax({ 
       type: "POST", 
       url: url, 
       data: $(this).serialize(), 
       success: function (data) 
       { 
        $.each(rows_selected, function(index, rowId){ 
        // Remove hidden element 
        $(form).children("input").remove(); 
        }); 

       } 
      }); 
      return false; 
     } 
    })