2017-01-11 7 views
0

Я создал настраиваемое раскрывающееся меню для фильтрации значений в определенном столбце Datatables. Когда я пытаюсь фильтровать \ искать столбец с выбранным значением, то datatable остается неизменным.Datatables Search Filter Значение в столбце

DataTable и фильтр событий:

var table = $('#dt'); 
var dt = table.DataTable({ 
    ajax: { 
     type: 'POST', 
     cache: false, 
     url: '/DataTablesHandler' 
    }, 
    columns: [ 
     { 
      data: 'idLevel', 
      orderable: false, 
      targets: 'no-sort', 
      searchable: true 
     }, 
     { data: 'email' }, 
     { data: 'phone' }, 
     { data: 'fax' } 
    ], 
    order: [0, 'asc'], 
    processing: true, 
    serverSide: true, 
    orderMulti: false, 
    bStateSave: true 
}); 

//filter search on entity level change 
$('#workEntityLevel').on('change', function() 
{ 
    var levelID = $(this).val(); 

    if (levelID == 0) 
    { 
     //clear search 
     dt.search('').columns().search('').draw(); 
    } 
    else 
    { 
     //search idLevel column (NOT WORKING!!!)  
     dt.columns(0).search(levelID).draw(); 
    } 
}); 

Что я делаю неправильно?

+0

является данные в объекте данных для этого столбца (уровень идентификатор) целое или строку? – Bindrid

+0

'.val()' всегда возвращает строковое значение. – mmushtaq

+0

@bindrid его числовое значение (1, 2, 3, 4, 5 и 6). но я уже тестировал его, вызывая строковое значение, и результаты те же. – Ricky

ответ

1

Попробуйте что-нибудь подобное, когда ajax является отдельным (я не тестировал это, но вы поняли идею).

var tableDefinition = { 

     columns: [ 
      { 
       data: 'idLevel', 
       orderable: false, 
       targets: 'no-sort', 
       searchable: true 
      }, 
      { data: 'email' }, 
      { data: 'phone' }, 
      { data: 'fax' } 
     ], 
     order: [0, 'asc'], 
     processing: true, 
     serverSide: false, 
     orderMulti: false, 
     bStateSave: true 
    }; 

    $(function($) { 

     table = null; 
     $.ajax({url: '/DataTablesHandler', 
      type: "POST", 
      async: true, 
      // if you know what the initial parameters are 
      // create an object that emulates it here. 
      data : function() {JSON.stringify({ 'draw': 1, 'start': 0, 
         length:15 })}, 

      contentType: "application/json; charset=utf-8", 
      success: function (data) { 
       // fine tune your data. Mine comes back from a web service so this code fragment reflects that. 
       var parsedData = JSON.parse(data.d); 
       tableDefinition.data = parsedData; 

       var table = $('#dt'); 
       var dt = table.DataTable(tableDefinition); 
      }, 
      error: function(a,b,c) { debugger;} 
     }); 

     //filter search on entity level change 
     $('#workEntityLevel').on('change', function() 
     { 
      var levelID = $(this).val(); 

      if (levelID == 0) 
      { 
       //clear search 
       dt.search('').columns().search('').draw(); 
      } 
      else 
      { 
       //search idLevel column (NOT WORKING!!!)  
       dt.columns(0).search(levelID).draw(); 
      } 
     }); 

    }); 
+0

Я пытаюсь ваше решение, но для моего действия DataTablesHandler нужны параметры по умолчанию Datatables для запроса и возврата данных: public JsonResult DataTablesHandler (параметр DTParameters) {}; как я могу отправить эти данные с помощью вашего примера? – Ricky

+0

Я добавил раздел для создания объекта параметров. Он должен быть настроен так, чтобы выглядеть так, как ожидает сервер. – Bindrid

+0

обновил пример, но объект параметра продолжает null на стороне сервера – Ricky

0

Вот версия, которая включает в себя levelid в поиске на вызов AJAX, так что вы можете использовать его для фильтрации на стороне сервера

var table = $('#dt'); 
    var dt = table.DataTable({ 
     ajax: { 
      type: 'POST', 
      cache: false, 
      data: function (search) { 
       // fine tune what you need to send back here. 
       search.levelID = $('#workEntityLevel').val(); 
       return JSON.stringify(search)}, 
      dataType:"json", 
      url: '/DataTablesHandler' 
     }, 
     columns: [ 
      { 
       data: 'idLevel', 
       orderable: false, 
       targets: 'no-sort', 
       searchable: true 
      }, 
      { data: 'email' }, 
      { data: 'phone' }, 
      { data: 'fax' } 
     ], 
     order: [0, 'asc'], 
     processing: true, 
     serverSide: true, 
     orderMulti: false, 
     bStateSave: true 
    }); 

    //filter search on entity level change 
    $('#workEntityLevel').on('change', function() 
    { 
     dt.draw(); 
    }); 
+0

из того, что я читал, dt.draw() вызовет вызов ajax, в котором я передаю идентификатор уровня – Bindrid

+0

, протестировал эту версию и всегда запускает вызов ajax. думаю, нет обходного пути, верно? – Ricky