2015-09-08 4 views
2

У меня есть datatable, который, когда я нажимаю на строку, выделяет строку. Я хочу сохранить индекс строки и использовать его для повторного выделения этой строки при перезагрузке страницы.jquery datatable добавить класс в строку

var table = $('#example').DataTable({ 
        "ajax": "DataQueries/FetchOpenJobs.asp", 
        stateSave: true, 
        "aLengthMenu": [[10, 25, 50, 100], [10, 25, 50, 100]], 
        "iDisplayLength": 25, 
        "order": [[ 0, "desc" ]], 
        columnDefs: [ 
         {"visible": false, "targets": [2,3]}, 
         {"type": 'date-uk', "targets": [1,9,10] }, 
         {"type": 'title-string', "targets": [11] } 
        ], 
       }); 

Я могу получить индекс строки, используя ниже:

var selectedRowIndex = table.row(this).index(); 

Однако я не уверен, о том, как повторно выделить с помощью индекса строки.

+0

Вы сохраняете его на стороне сервера в любом месте? или только в браузере клиента? –

ответ

0

Это должно сделать трюк:

$('#id tbody > tr').eq(rowindex) 

или

$('#id tbody > tr').eq(rowindex).children().addClass('myClass'); 
+0

попробовал это, но не повезло. Когда страница перезагружается, она по-прежнему падает с подсветки – Saj

+0

Поместите этот код в ['" fnInitComplete ": function (oSettings, json) {// здесь код}});'] (https://datatables.net/reference/ option/initComplete) – ozil

+0

Я добавил это к initComplete, но все же не повезло – Saj

1

Я думаю, этот вопрос заслуживает более тщательного пример.

Я бы сохранил выбранные id (s) в localStorage как стробированный массив. Когда страница загружается (повторно), затем извлекайте массив и, если он содержит любые сохраненные индексы, выделите соответствующие строки. Ниже пример кода в объяснительной порядке:

Sample код highlightning строки, когда они кликают:

$('#example').on('click', 'tr', function() { 
    $(this).toggleClass('highlight'); 
    processSelected(table.row(this).index(), $(this).hasClass('highlight')); 
}); 

Базовый код для поддержания массива выделенных индексов строк в LocalStorage:

function processSelected(id, selected) { 
    if (selected) { 
     selectedRows.push(id); 
    } else { 
     selectedRows.splice(selectedRows.indexOf(id), 1); 
    } 
    localStorage.setItem('selectedRows', JSON.stringify(selectedRows)); 
} 

Когда страница загружена, извлеките массив из localStorage:

var selectedRows = JSON.parse(localStorage.getItem('selectedRows')); 

Наконец, повторно выделить сохраненные индексы строк, когда DataTable инициализируется:

var table = $('#example').DataTable({ 
    initComplete : function() { 
     if (!Array.isArray(selectedRows)) { 
      //selectedRows does not exists in localStorage or is messed up 
      selectedRows = []; 
     } else { 
      var _table = this.api(); 
      selectedRows.forEach(function(index) { 
      //for some reason to$() doesnt work here 
      $(_table.row(index).node()).addClass('highlight'); 
      }) 
     }  
    } 
}); 

демо ->http://jsfiddle.net/f3ghvz4n/

Попробуйте демо, выделить несколько строк, а затем перезагрузите страницу. Обратите внимание, что это работает и с разбитым на страницы dataTable!


Update. При использовании AJAX DATASRC перезагрузке каждые 30 секунд, я думаю, что вы могли бы пропустить initComplete и полагаться только на draw.dt события:

var table = $('#example').DataTable(); 

$('#example').on('draw.dt', function() { 
    if (!Array.isArray(selectedRows)) { 
     selectedRows = []; 
    } else { 
     selectedRows.forEach(function(index) { 
     $(table.row(index).node()).addClass('highlight'); 
     }) 
    } 
}) 

Полностью тестировался, но не может понять, почему он не должен работать.

+0

Это замечательно. На самом деле это делает подсветку, но у меня все еще есть небольшая проблема. Я использовал функцию table.ajax.reload() для перезагрузки таблицы каждые 30 секунд. В этот момент я теряю изюминку. Но если я обновляю всю страницу, подсветка снова включается (до тех пор, пока следующий ajax, reload() не начнет) – Saj

+0

@Saj, поместите код внутри 'initComplete' в функцию, которую вы можете вызвать после каждого' ajax.reload () '. – davidkonrad

+0

Можно ли так назвать это? table.ajax.reload (функция() { \t \t \t \t \t \t, если (Array.isArray (selectedRows)) { \t \t \t \t \t \t \t \t selectedRows = [];! \t \t \t \t \t \t \t \t} else { \t \t \t \t \t \t \t \t var _table = this.api(); \t \t \t \t \t \t \t \t selectedRows.forEach (функция (индекс) { \t \t \t \t \t \t \t \t \t $ (_ table.row (индекс) .node()) addClass ('выбрано');. \t \t \t \t \t \t \t \t \t}); \t \t \t \t \t \t \t} \t \t \t \t \t}); – Saj

Смежные вопросы