Обновление плагина jQuery Tablesorter после удаления строки из DOM - PullRequest
19 голосов
/ 15 декабря 2009

В данный момент у меня есть код, который скрывает удаленную строку, а затем удаляет ее с помощью функции .remove ().

Однако у меня возникают трудности с тем, чтобы он оставался «удаленным», так как каждый раз, когда я обновляю плагин отсортированной таблицы или плагин фильтра, который я использую… удаленные строки снова появляются, поскольку они, конечно, кэшируются.

Текущий код просто с обновлением виджета на данный момент

$('.deleteMAP').live("click", function(){
  $(this).closest('tr').css('fast', function() {
 $(this).remove();
 $(".tablesorter").trigger("update");
 $(".tablesorter").trigger("applyWidgets");
  });
})

Есть ли в любом случае удалить «строку» как из кеша плагина пейджера, так и плагина таблиц, так что когда я «обновляю» таблицу, чтобы отразить факт удаления строки, они не появляются снова вернуться из мертвых через кеш!

Ответы [ 7 ]

17 голосов
/ 06 января 2010

Я нашел решение, которое сработало для меня:

var usersTable = $(".tablesorter");
usersTable.trigger("update")
  .trigger("sorton", [usersTable.get(0).config.sortList])
  .trigger("appendCache")
  .trigger("applyWidgets");

Поставьте это после того места, где вы редактировали таблицу.

5 голосов
/ 15 декабря 2009

После некоторого возни с этой проблемой я пришел к выводу, что проблемы возникают при комбинированном использовании jQuery Tablesorter + jQuery TablesorterPager. Без пейджера удаление строки и выполнение и "обновление" достаточно.

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

Но главная причина вашей проблемы заключается в том, что jQuery Tablesorter не считается используемым для таблиц, которые вы намереваетесь изменить (в смысле добавления / удаления строк). И это относится еще больше, когда вы дополнительно используете TablesorterPager. Просто перечитайте описание jQuery Tablesorter

tablesorter - это плагин jQuery для превращение стандартной таблицы HTML с THEAD и TBODY теги в сортируемый таблица без обновления страницы.

Четкая и краткая область применения TableSorter. Он даже не упоминает ajax, редактировать, удалять, добавлять, ..... или подобные термины на странице. Это только для сортировки статической таблицы.

Таким образом, реальное решение ... начать поиск другого jQuery-плагина "Table", который был создан с самого начала с намерением / возможностью изменения таблицы. И который поддерживает это по умолчанию (удаление, добавление, ....)


Хорошо, но вот решение для:

jQuery Tablesorter + TablesorterPager удалить строки (TR)

Быстрое копирование-вставка исходного кода javascript (HTML на основе Пример TablesorterPager )

// "borrowed" from John Resig: Javascript Array Remove
// http://ejohn.org/blog/javascript-array-remove/
Array.prototype.remove = function(from, to) {
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);
};

//repopulate table with data from rowCache
function repopulateTableBody(tbl) {
    //aka cleanTableBody from TableSorter code
    if($.browser.msie) {
        function empty() {
            while ( this.firstChild ) this.removeChild( this.firstChild );
        }
        empty.apply(tbl.tBodies[0]);
    } else {
        tbl.tBodies[0].innerHTML = "";
    }
    jQuery.each(tbl.config.rowsCopy, function() {
        tbl.tBodies[0].appendChild(this.get(0));
    });
}
//removes the passed in row and updates the tablesorter+pager
function remove(tr, table) {
    //pager modifies actual DOM table to have only #pagesize TR's
    //thus we need to repopulate from the cache first
    repopulateTableBody(table.get(0));
    var index = $("tr", table).index(tr)-2;
    var c = table.get(0).config;
    tr.remove();
    //remove row from cache too
    c.rowsCopy.remove(index);
    c.totalRows = c.rowsCopy.length;
    c.totalPages = Math.ceil(c.totalRows / config.size);
    //now update
    table.trigger("update");
    //simulate user switches page to get pager to update too
    index = c.page < c.totalPages-1;
    $(".next").trigger("click");
    if(index)
        $(".prev").trigger("click");
}

$(function() {
    var table;
    //make all students with Major Languages removable
    $('table td:contains("Languages")').css("background-color", "red").live("click", function() {
        remove($(this).parents('tr').eq(0), table);
    });

    //create tablesorter+pager
    // CHANGED HERE OOPS
    // var table = $("table#tablesorter");
    table = $("table#tablesorter");
    table.tablesorter( { sortList: [ [0,0], [2,1] ] } )
        .tablesorterPager( { container: $("#pager")}  );
});

Я сделал для вас тестовую страницу с моим решением (нажмите на красный TD ==, удаляя эту строку).

http://jsbin.com/uburo (http://jsbin.com/uburo/edit для источника)

Если остается вопрос о том, как / почему / .... Комментарий

4 голосов
/ 18 мая 2011

Ситуация усложняется, когда вы используете плагины tableorterpager и tablesorterfilter - решение с:

$("#gridTable").trigger("update").trigger("appendCache").trigger("applyWidgets");

работает только для пейджера, фильтр имеет другой кеш. Я искал решение почти 2 часа, наконец я написал что-то вроде этого:

$("#deleteRowButton").click( function(){
  // index of row which will be deleted
  var index = $('#gridTable tr[rel="'+$("#removeThisID").val()+'"]').index();
  // table with tablesorter
  var table = document.getElementById( 'gridTable' ).config.cache.row;
  // deleting row
  $('#gridTable tr[rel="'+$("#removeThisID").val()+'"]').remove();
  // truly DELETING row, not only mark as deleted - after this list of rows should look like [tr], [tr], [tr], undefined, [tr], ...
  delete( table[index] );
  // tablesorter things
  $("#gridTable").trigger("update").trigger("appendCache").trigger("applyWidgets");
});

Я удаляю строку, атрибут rel которой совпадает со значением input # removeThisID.

Теперь пришло время изменить плагин tablesorterfilter. В функции doFilter найдите строки:

// Walk through all of the table's rows and search.
// Rows which match the string will be pushed into the resultRows array.
var allRows = table.config.cache.row;
var resultRows = [];

и замените их на:

// Walk through all of the table's rows and search.
// Rows which match the string will be pushed into the resultRows array.
var allRows = table.config.cache.row;

// refresh cache 'by hand'
var newcache = new Array();
var i = 0;        
for( var a in allRows )
{
  newcache[i] = allRows[a];
  i++;
}
allRows = newcache;
var resultRows = [];

вот и все ...

С уважением от Польши:)

3 голосов
/ 25 января 2012

Это кажется странным подходом, но на самом деле это сработало для меня. Таблица хорошо отображается, а пейджер работает правильно.

$("#tabeBodyId").empty();
$("#tableId colgroup").remove();

//Update table(done using Ajax)
$("#tableId").tablesorter({widthFixed: true}).tablesorterPager({container: $("#pager")}); 
1 голос
/ 12 февраля 2012

Пожалуйста, взгляните на вилку Motties. Он сделал пример добавления / удаления строк при использовании плагинов таблиц и пейджеров. http://mottie.github.com/tablesorter/docs/example-pager.html

1 голос
/ 21 октября 2011

Лучше использовать table.splice (index, 1); чем удалить (таблица [индекс]) ;! «Удалить» сделать просто пустой элемент массива, но не удалить полностью. Извините за мой английский! =) * * Тысяча одна

1 голос
/ 15 февраля 2010

Решение по джиттеру почти работало для меня, хотя для обновления отсутствовала строка (см. Код ниже). Я расширил код, чтобы разрешить вставку новых TR в таблицу.

Я играл, и это работает для меня под FFox, не проверял IExplorer. В любом случае, есть ошибка, которую я пока не могу исправить: если вы добавите новый TR, а затем попытаетесь удалить его, он не будет удален из таблицы: (

// "borrowed" from John Resig: Javascript Array Remove
// http://ejohn.org/blog/javascript-array-remove/
Array.prototype.remove = function(from, to) {
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);
};

//repopulate table with data from rowCache
function repopulateTableBody(tbl) {
    //aka cleanTableBody from TableSorter code
    if($.browser.msie) {
        function empty() {
            while ( this.firstChild ) this.removeChild( this.firstChild );
        }
        empty.apply(tbl.tBodies[0]);
    } else {
        tbl.tBodies[0].innerHTML = "";
    }
    jQuery.each(tbl.config.rowsCopy, function() {
        tbl.tBodies[0].appendChild(this.get(0));
    });
}
//removes the passed in row and updates the tablesorter+pager
function tablesorter_remove(tr, table) {
    //pager modifies actual DOM table to have only #pagesize TR's
    //thus we need to repopulate from the cache first
    repopulateTableBody(table.get(0));
    var index = $("tr", table).index(tr)-2;
    var c = table.get(0).config;
    tr.remove();

    //remove row from cache too
    c.rowsCopy.remove(index);
    c.totalRows = c.rowsCopy.length;
    c.totalPages = Math.ceil(c.totalRows / config.size);

    //now update
    table.trigger("update");
    table.trigger("appendCache");

    //simulate user switches page to get pager to update too
    index = c.page < c.totalPages-1;
    $(".next").trigger("click");
    if(index)
        $(".prev").trigger("click");
}

function tablesorter_add(tr, table) {
    //pager modifies actual DOM table to have only #pagesize TR's
    //thus we need to repopulate from the cache first
    repopulateTableBody(table.get(0));
    table.append(tr);

    //add row to cache too
    var c = table.get(0).config;
    c.totalRows = c.rowsCopy.length;
    c.totalPages = Math.ceil(c.totalRows / config.size);

    //now update
    table.trigger("update");
    table.trigger("appendCache");

    //simulate user switches page to get pager to update too
    index = c.page < c.totalPages-1;
    $(".next").trigger("click");
    if(index)
        $(".prev").trigger("click");

    //Set previous sorting method
    var sorting = c.sortList;
    if(sorting == '')
        sorting = [[0,0]];
    table.trigger("sorton", [sorting]);
}

И вы можете использовать это следующим образом:

Добавить новый TR со сложным HTML в нем:

tablesorter_add('<tr id="'+data.id+' " title="Haz click para editar" onclick="edit('+data.id+')"><td id="'+data.id+'_genus">'+data.genus+'</td><td id="'+data.id+'_species">'+data.species+'</td></tr>', $("#orchid_list"));

Удалить все TR:

tablesorter_remove($("#"+orchid_id),$("#orchid_list"));

Моя упрощенная таблица образцов:

<table id="orchid_list" class="tablesorter">
<thead>
<tr>
    <th id="genus">Género</th>
    <th id="species">Especie</th>
</tr>
</thead>
<tbody>
    <tr id="2" title="Haz click para editar" onclick="edit('2')">
        <td id="2_genus">Amitostigma</td>

        <td id="2_species">capitatum</td>
    </tr>
    <tr id="4" title="Haz click para editar" onclick="edit('4')">
        <td id="4_genus">Amitostigma</td>
        <td id="4_species">tetralobum</td>
    </tr>
</tbody>
</table>
...