您已经发现问题区域是compileFilter,但是您的问题和这篇文章帮助我找出了根本原因:https://github.com/mleibman/SlickGrid/issues/244
我的猜测:Slick Grid 的作者希望您使用 options.inlineFilters = false 来解决这个问题。
我想了解为什么只有在使用 ASP.NET 中的捆绑时才会出现此问题,结果发现:
使用 ASP.NET 捆绑和缩小时,return true 和 return false 将分别替换为 return!0 和 return!1。
(即使您拨打Bundle.Transforms.Clear()也会发生这种情况)
Slick Grid 的 compileFilter 和 compileFilterWithCaching 函数尝试使用正则表达式重写循环结构内的过滤器函数,并将 return 语句更改为 continue 语句。
您从捆绑中删除过滤器功能的解决方案也对我有用,但我不喜欢使用捆绑时出现异常,因此我修改了 slick.dataview.js (v2.2) 来处理 ASP 的替换。 NET 捆绑:
我将这两行添加到compileFilter 和compileFilterWithCaching:
.replace(/return!1\s*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
这样
var filterBody = filterInfo.body
.replace(/return false\s*([;}]|$)/gi, "{ continue _coreloop; }$1")
.replace(/return true\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1")
.replace(/return ([^;}]+?)\s*([;}]|$)/gi,
"{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
成为
var filterBody = filterInfo.body
.replace(/return false\s*([;}]|$)/gi, "{ continue _coreloop; }$1")
.replace(/return true\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1")
.replace(/return!1\s*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0\s*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
.replace(/return ([^;}]+?)\s*([;}]|$)/gi,
"{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
现在我可以继续使用 ASP.NET B&M 捆绑我的所有脚本,并且 slick grid 很高兴。
更新:compileFilterWithCaching 实际上略有不同,因为缓存添加步骤。更正更新为function compileFilterWithCaching() 是:
var filterBody = filterInfo.body
.replace(/return false\s*([;}]|$)/gi, "{ continue _coreloop; }$1")
.replace(/return true\s*([;}]|$)/gi, "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1")
.replace(/return!1\s*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0\s*([;}]|$)/gi, "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
.replace(/return ([^;}]+?)\s*([;}]|$)/gi,
"{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");
我正在考虑在 GitHub 上针对此更改提出拉取请求,但我可能会先对其进行一些修改,以添加是否处理 ASP.NET 捆绑的选项...待定。同时我将这个问题发布到了 GitHub 页面:https://github.com/mleibman/SlickGrid/issues/1053