Подтвердить что ты не робот

JqGrid GridUnload/GridDestroy

Когда я использую $('#mygrid').jqGrid('GridUnload');, моя сетка уничтожается: нет заголовка пейджера/нет.

В wiki я нашел:

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

Я не могу найти разницы между GridUnload/GridDestroy или что-то не так?

Я использую jqGrid 3.8.

4b9b3361

Ответ 1

Чтобы создать jqGrid на странице, вы должны вставить пустой элемент <table> на место страницы, где вы хотите увидеть сетку. Простейшим примером элемента таблицы является <table id="mygrid"></table>.

Пустой элемент <table> будет не отображаться на странице до вызова $('#mygrid').jqGrid({...}), и будут созданы элементы сетки, такие как заголовки столбцов.

Метод GridDestroy работает как jQuery.remove. Он удаляет все элементы, которые относятся к элементу inclusve сетки <table>.

Метод GridUnload, с другой стороны, удаляет все, но элемент empty <table> остается на странице. Таким образом, вы можете создать новую сетку в одном месте. Метод GridUnload очень полезен, если вам нужно создать на одном месте различные решетки, зависит от разных условий. Посмотрите старый ответ с демо. Демонстрация показывает, как две разные решетки могут динамически создаваться на одном и том же месте. Если вы просто замените GridUnload в коде на GridDestroy, демонстрация не будет работать: после уничтожения первой сетки никакие другие сетки не будут созданы на одном и том же месте.

Ответ 2

В дополнение к ответу Олега, я хотел бы указать, что GridUnload делает немного больше, чтобы просто удалить сетку из таблицы. Он удаляет исходный элемент таблицы HTML (и пейджер) и рекламирует идентичную на своем месте (по крайней мере, в 4.5.4).

Это означает, что если вы привязали некоторые обработчики событий к элементу HTML таблицы (например, с jquery on, например ('#gridID'). on ('event', 'selector', handler)), они также будут удалены. Когда-то события не будут срабатывать в новой сетке, если вы замените старую сетку новой...

Ответ 3

Олег отвечает, отлично работает для меня, пока у меня нет заголовков групп.

Когда я добавляю строку заголовка группы с помощью 'setGroupHeaders'

результаты "GridUnload", за которыми следует $('# mygrid'). jqGrid ({...}) несовместимы.

Он отлично работает в Chrome, но не в IE11.

В IE11 каждый элемент "jqg-third-row-header" попадает в разные строки (по диагонали).

Я использую free-jqGrid: query.jqgrid.src.js версию 4.13.4 для отладки. Я проследил проблему до кода в этом файле, который начинается с строки 9936:

if (o.useColSpanStyle) {
    // Increase the height of resizing span of visible headers
    $htable.find("span.ui-jqgrid-resize").each(function () {
        var $parent = $(this).parent();
        if ($parent.is(":visible")) {
            this.style.cssText = "height:" + $parent.height() + "px !important; cursor:col-resize;";
            //this.style.cssText = "height:" + $parent.css('line-height'); + "px !important;cursor:col-resize;";
        }
    });
    // Set position of the sortable div (the main lable)
    // with the column header text to the middle of the cell.
    // One should not do this for hidden headers.
    $htable.find(".ui-th-column>div").each(function () {
        var $ts = $(this), $parent = $ts.parent();
        if ($parent.is(":visible") && $parent.is(":has(span.ui-jqgrid-resize)") && !($ts.hasClass("ui-jqgrid-rotate") || $ts.hasClass("ui-jqgrid-rotateOldIE"))) {
            // !!! it seems be wrong now
            $ts.css("top", ($parent.height() - $ts.outerHeight(true)) / 2 + "px");
            // $ts.css("top", ($parent.css('line-height') - $ts.css('line-height')) / 2 + "px");
        }
     });
}
$(ts).triggerHandler("jqGridAfterSetGroupHeaders");
});

Этот код устанавливает значения высоты и верхнего значения css, связанные с каждым элементом "jqg-third-row-header" . Это приводит к высокой и диагональной компоновке "jqg-third-row-header" ,

Потенциальная ошибка:.

Методы $parent.height() и $ts.height(), выше, возвращают прежнюю высоту таблицы jqGrid в IE11. В Chrome они возвращают 'th' вычисленную высоту (top = 0). Я добавил и протестировал две прокомментированные строки, которые используют линейную высоту. IE11 отлично работает, когда используется высота линии. Я не совсем понимаю логику изменения размера JqGrid, поэтому это может быть не проблема.
Альтернативное решение:

Если вы укажете.

 colModel: 
     {
     label: 'D',
     name: 'W',
     width: 6,
     align: 'center',
     resizable:false  //required for IE11 multiple calls to this init()
     },

Если значение resizable false, код выше не встречается, а высота и верхняя часть не заданы.
Олег jqGrid - очень хороший контроль. Возможно, он может проверить свою демонстрационную сетку с помощью groupheader на IE11.