我的网络应用程序可以正常使用捆绑脚本,直到设置<compilation debug="true" />
为止。如果我将调试设置为false
,我的自定义脚本将缩小,然后停止工作。
我可以在不同的浏览器上重现这个问题,使用F12工具检查所有内容 - 没有错误,发现全局JavaScript变量是否具有正确的名称。唯一值得注意的区别是脚本被缩小,局部变量名称同样更改参数名称,这不应该破坏任何东西。我还有其他自定义脚本捆绑和缩小,它们正常工作。
我相信这是愚蠢的事。我不是JavaScript专家,也许我错过了一些明显的东西。你能给我一个如何找到问题原因的小贴士吗?
此致 雷沙德雷
答案 0 :(得分:1)
在调试器调试之后,在slick.dataview.js
函数的compileFilter
脚本中找到了错误源。我在页面上使用SlickGrid并在Slick.Data.DataView
对象中设置过滤器。 compileFilter
函数对提供的过滤器函数执行一些硬编码的字符串替换,这些过滤器函数在捆绑过滤器函数时会失败,然后在释放代码中缩小。
我将过滤器功能移出了缩小的脚本。这解决了这个问题。
答案 1 :(得分:1)
您已经发现问题区域为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
语句。 / p>
你从捆绑中删除过滤器功能的解决方案也适用于我,但我不喜欢使用捆绑的例外,所以我改为修改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&amp; M捆绑我的所有脚本,并且光滑的网格很高兴。
更新:由于缓存添加步骤,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捆绑... TBD。与此同时,我将此问题发布到GitHub页面:https://github.com/mleibman/SlickGrid/issues/1053