jqGrid beforeProcessing 停止加载和 ReloadGrid

jqGrid beforeProcessing stop loading and ReloadGrid

这是我的例子:enter link description here

如何自动重新加载?

beforeProcessing: function (data, status, xhr) { 
    if (data.rows === '') {
        $('#jqGridPreparate').jqGrid('clearGridData');
        return false;
    }
    if (data.inputCol) {
        $("td.ui-search-input input#id_prep").val('');
        $("td.ui-search-input input#id_opisanie").val(data.inputCol);
        var rplc = $.parseJSON($("#jqGridPreparate")[0].p.postData.filters);
        for (var i=0; i < rplc.rules.length; i++) {
            if (rplc.rules[i].field === 'prep') {
                rplc.rules[i].field = 'opisanie';
            }
        }
        $.extend($("#jqGridPreparate")[0].p.postData,{filters:JSON.stringify(rplc)});
        $("#jqGridPreparate")[0].triggerToolbar(); // not WORK
    }
}

我不确定我是否完全理解您要实施的内容。我可以猜想,如果某些附加信息将从服务器 return 编辑,您想要应用过滤器。

看来您在 jqGrid 和服务器之间实现了一些关于 returned 数据的自定义协议。 rows 服务器响应的一部分应该是项目数组。在您的情况下,服务器可以将空字符串设置为 rows 的值。您尝试使用服务器响应的 inputCol 属性 来强制过滤 先前加载的数据 。您对 现有 过滤器进行了一些自定义修改,填充了过滤器工具栏的一些字段,最后您尝试使用 triggerToolbar。代码非常不清楚,它包含许多您没有直接描述的假设。我不清楚你是想开始 local 过滤还是 jqGrid 应该使用修改后的过滤器向服务器发送新请求。

无论如何,如果你想在其他回调函数中启动某种reloading/filtering,你应该考虑一些基本规则。首先,方法 triggerToolbar 或触发 reloadGrid 工作 同步 。意思是jqGrid先做triggerToolbar,再做reloadGrid,直到结束,然后执行$("#jqGridPreparate")[0].triggerToolbar();之后的下一行代码。因此,强烈建议将 triggerToolbarreloadGrid 的所有调用放在 setTimeout 主体内。它允许处理当前回调直到结束,然后才进行重新加载。如果来自服务器的响应包含您的自定义信息而不是典型的 jqGrid 数据,那么您应该从 beforeProcessing return false 停止标准处理。

如果你可以构建postData.filters那么你就不需要使用triggerToolbar来应用过滤器。取而代之的是,您只需要另外设置 jqGrid 的 search: true 参数,然后触发 reloadGrid.

对应的代码大概如下:

beforeProcessing: function (data, status, xhr) {
    var $self = $(this), p = $self.jqGrid("getGridParam");
    if (data.rows === "") {
        $self.jqGrid("clearGridData");
        return false; // don't process the data by jqGrid
    }
    if (data.inputCol) {
        var i, rplc = $.parseJSON(p.postData.filters);
        for (i = 0; i < rplc.rules.length; i++) {
            if (rplc.rules[i].field === "prep") {
                rplc.rules[i].field = "opisanie";
            }
        }
        p.postData.filters = JSON.stringify(rplc);
        setTimeout(function () {
            // apply the filter
            p.search = true;
            $self.trigger("reloadGrid", [{page: 1}]);
        }, 50);
        return false; // don't process the data by jqGrid
    }
}