jqGrid не вызывает blockUI без setTimeout при сбое ajax

0

Я использую jqGrid 4.54 в своем проекте, и я хочу разместить сообщение, блокирующее интерфейс, когда есть ошибка сервера.

Я знаю, что blockUI 2.66.0 не работает с синхронным ajax, поэтому я использую jqGrid следующим образом:

$.extend($.jgrid.ajaxOptions, { async: true });
$.extend($.jgrid.defaults, {
    mtype: "POST",
    altRows: true,
    datatype: "json",
    loadonce: true,
    height: "auto",
    width: 1100,
    rowNum: 10,
    rowList: [10, 20, 30, 40, 50],
    viewrecords: true,
    pager: "#paginacao",
    sortorder: "asc",
    shrinkToFit: false,
    headertitles: true,
    loadui: "disable",
    rownumbers: true,
    emptyrecords: "<strong>Não houve resultado para o seu filtro.<strong>",
    autoencode: true,
    caption: "Resultados encontrados",
    deselectAfterSort: true,
    gridview: true,
    idPrefix: "id",
    rowTotal: 4000,
    sortable: true,
    toppager: true,
    loadError: function(xhr, status, error) {
        $.blockUI({
            message: '<p style=\"font-weight: bolder; color: white;\">Erro ao tentar gerar relat&oacute;rio, por favor, tente novamente.<br /><br /><a onclick=\"$.unblockUI();\">Fechar</a></p>',
            timeout: 5000,
            onOverlayClick: $.unblockUI
        });
    },
    jsonReader: {
        root: "rows",
        page: "page",
        total: "total",
        records: "records",
        repeatitems: true,
        id: 0,
        cell: ""
    }
});

Но таким образом плагин не работает вообще. Когда я получаю blockUI и обертываю его в window.setTimeout, он работает, как показано ниже:

loadError: function(xhr, status, error) {
    window.setTimeout("$.blockUI({ message: '<p style=\"font-weight: bolder; color: white;\">Erro ao tentar gerar relat&oacute;rio, por favor, tente novamente.<br /><br /><a onclick=\"$.unblockUI();\">Fechar</a></p>', timeout: 5000, onOverlayClick: $.unblockUI});", 10);
}

Кто-нибудь знает, как сделать это без window.setTimeout?

Теги:
jqgrid

2 ответа

0
Лучший ответ

У нас были настройки по умолчанию для AJAX, которые конфликтуют с плагином jqGrid. Поскольку мы разработали плагин jQuery, мы решили установить эти параметры в объект $.ajax внутри метода, как показано ниже.

$.fn.carregaConteudoViaAjax = function(url, dados, idElemento) {
    if (typeof idElemento === "undefined") {
        idElemento = "#" + this.attr("id");
    }

    $.ajax({
        url : url,
        data : dados,
        success : function(result, statusRequestAjax, xhr) { $(idElemento).html(result.mensagem); },
        type: "POST",
        dataType : "json",
        cache : false,
        error : function(xhr, statusRequestAjax, error) { $("#msgErros").html(error); },
        beforeSend: function() { $.blockUI(); },
        complete : function() { $.unblockUI(); }
    });

    return this;
};

И тогда мы вызываем метод следующим образом: $("#idElemento").carregaConteudoViaAjax(url, objetoJS);

0

Да, я тоже сталкиваюсь с этим раньше. Поскольку я знаю, что javascript-код является асинхронным. Когда ваш вызов ajax запущен, по умолчанию ajax также асинхронен.

В основном, что происходит, ваш код javascript продолжает работать до завершения ajax-вызова и получения результатов. Таким образом, вы должны сделать свою функцию загрузки сетки сетью синхронной.

Попробуйте следующее: $.extend($.jgrid.ajaxOptions, { async: false });
(Цель состоит в том, чтобы ваша сетевая загрузка ajax была синхронной.)

Дайте мне знать, если это сработает.

  • 0
    Как я уже сказал, blockUI, к сожалению, не работает с синхронным ajax, если я использую этот способ, функция blockUI перестает работать, плюс я проверил ваше предложение и до сих пор не работает.
  • 0
    Вместо setTimeout, вызовите alert перед вызовом blockUI и посмотрите, работает ли он. Это просто для отладки.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню