【问题标题】:jqGrid - Custom filtering works but not after reopening a grid in a modal windowjqGrid - 自定义过滤有效,但在模式窗口中重新打开网格后无效
【发布时间】:2012-02-13 20:30:26
【问题描述】:

我有一个自定义过滤功能,它传入一个自定义 url 并通过以下方式重新加载网格数据:

function filter_grid(filter) {
    grid = $(filter).parents('.ui-jqgrid-view').find('.grid');
    /* build the url in here*/
    $(grid).setGridParam({loadonce:false, datatype:'json'});
    jQuery(grid).setGridParam({url:myurl}).trigger("reloadGrid");
    $(grid).setGridParam({loadonce:true});
}

这可以正常工作并按预期过滤数据。但是,我允许用户在模态窗口中打开网格,这也将在您第一次打开模态窗口时起作用但是如果您随后关闭窗口并重新打开它...过滤失败。我在控制台中没有看到任何错误......只是重新加载似乎永远不会发生。有什么建议吗?


澄清

简而言之,每个网格都有一个选择菜单。您可以在该菜单中选择一个选项,它将通过filter_grid 函数重新加载带有过滤数据的网格。它通过使用新 url 重新加载网格来重新加载,该 url 传递一些参数以过滤数据。

在 gridComplete 事件中,我将一个选择输入元素(稍后填充)附加到页面上的每个网格。每一个都有一个“过滤器”类:

$("#grid1 .ui-jqgrid-titlebar:eq(1)").append("<select id='pdd_user' name='filter_user' class='category_select filter'><option value=''>All</option></select>")

我观察过滤器类的点击:

$('.filter').live('change', function() {
        filter_grid(this);
    });

如您所见,这调用了filter_grid 函数(我在上面第一次编辑我的问题时包含的函数),这就是用过滤后的数据重新填充网格的原因:

jQuery(grid).setGridParam({url:myurl}).trigger("reloadGrid"); 

我将其设置为 loadonce:false,因为网格在最初创建时设置为 loadonce:true(用于本地排序目的),所以我将其设置回 loadonce:false,使用新的 url 和参数重新加载网格,然后将其设置回 loadonce:true 以再次启用本地排序。

【问题讨论】:

  • 您发布的代码难以理解。我想即使是代码也不正确(至少是你设置loadonce:true 的地方)。请描述代码应该做什么以及如果“过滤失败”会发生什么。您能先描述一下您是如何实现“自定义过滤器”的吗?您是否使用已弃用的 filterGrid 方法手动实现一些外部过滤器?请同时发布调用filter_grid函数的代码。
  • @Oleg 我已经更新了这个问题 Oleg,我希望它有助于澄清。

标签: javascript jquery jqgrid


【解决方案1】:

我不完全理解您的问题,但我希望您能帮助您找出代码中的问题。我认为您应该删除对 j​​qGrid 的 loadonce 选项的任何操作。这是不必要的和危险的。要使用服务器数据重新加载网格,您只需将datatype 设置为'json' 并使用.trigger("reloadGrid", [{page: 1, current: true}]); 重新加载网格(有关详细信息,请参阅here)。参数current: true 有助于在重新加载后在网格中找到选定的行。如果您使用数据分页,参数page: 1 会有所帮助。例如,如果用户选择了第二个页面,然后reloadGrid 将被启动,它将请求服务器也加载过滤结果的第二个页面。因此,寻呼机中可以有空网格和页码 2。对于 setGridParam 或使用上述 reloadGrid 参数将页码重置为 1 会有所帮助。

设置loadonce: false 的问题可能是在设置loadonce: true 之前是否会处理网格的重新加载。在这种情况下,网格中不会填充本地数据。所以loadonce: true这个选项应该是永久设置的。

如果您使用服务器端分页和本地数据排序,我建议您另外阅读this answer

【讨论】:

  • 好的,我删除了关于设置reloadonce:true 的行,并用一个调用替换了这些行,例如:jQuery(grid).setGridParam({datatype:'json',url:myurl}).trigger("reloadGrid", [{page:1, current:true}]);,虽然这会重新加载网格(它以前做过),但如果我重新加载网格仍然无法重新加载从模式窗口执行此操作。如果我打开模态并使用过滤器,它工作正常。如果我然后关闭模式窗口并重新打开它......当我使用过滤器时,网格将不再重新加载。
  • @gaoshan88:您没有发布“模态窗口”的代码。可能是您发布的代码部分没有问题。此外,我仍然不清楚网格和过滤器是如何与模态连接的。您是否在模态中同时使用过滤器和网格?您的自定义过滤器是否只有一个网格?我问最后一个问题是因为您发布的代码包含&lt;select&gt;id='pdd_user'。这样的代码只能在页面上使用一次,因为页面不应有 id 重复。
  • 我更新了那些小提琴。我希望它不会太多或太乱。
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 2019-06-21
  • 2016-03-31
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多