1

Мое веб-приложение прекрасно работает со связанным скриптом до тех пор, пока не будет установлен <compilation debug="true" />. Если я настрою отладку на false, мой пользовательский скрипт станет миниатюром, а затем просто перестанет работать.Сценарий, сокращенный с помощью связки, не работает в ASP.NET MVC 3, когда отладка отключена

Я могу воспроизвести эту проблему в разных браузерах, проверил все с помощью инструментов F12 - никаких ошибок, выяснил, имеют ли глобальные переменные JavaScript правильные имена. Единственное примечательное отличие состоит в том, что скрипт был минитипирован, а имена локальных переменных аналогичны именам параметров, которые не должны ничего сломать. У меня также есть другие настраиваемые скрипты, которые связаны и минимизированы, и они работают правильно.

Я считаю, что это что-то глупое. Я не эксперт в JavaScript и, возможно, я пропустил что-то очевидное для вас. Не могли бы вы рассказать мне, как найти причину проблемы?

С уважением, Ryszard

ответ

1

Вы уже поняли, что площадь проблема была compileFilter, но ваш вопрос и этот пост помог мне выяснил причину: https://github.com/mleibman/SlickGrid/issues/244

Мое предположение: автор Slick сетки предпочел бы использовать options.inlineFilters = false, чтобы получить вокруг этого.

Я хотел понять, почему этот вопрос только произошел, когда пакетирования в ASP.NET используется, и нашел это:

При использовании ASP.NET пакетирования и Минимизация return true и return false будет заменен return!0 и return!1, соответственно.

(Это происходит, даже если вы звоните Bundle.Transforms.Clear())

compileFilter и compileFilterWithCaching функции Slick Попытается управляющей сеткой в ​​радиолампе использовать регулярные выражения, чтобы переписать функцию фильтра внутри конструкции петли, и изменяет 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, и пятна сетки счастливы.

Обновление: 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

+0

Я не был так утончен :) Принял ваш ответ. Отличная работа! –

1

После отладки depper, найденное происхождение ошибки в slick.dataview.js сценария в compileFilter функции. Я использую SlickGrid на своей странице и устанавливаю фильтр в объекте Slick.Data.DataView. Функция compileFilter выполняет некоторые жестко закодированные замены строк по предоставленной функции фильтра, которые сбой при объединении функции фильтра, а затем уменьшаются в коде выпуска.

Я переместил функцию фильтра из миниатюрного сценария. Это решило проблему.

+0

Так вы знаете, я также сокращаю свой код (включая SlickGrid), и у меня нет никаких проблем. Я использую ASP.MVC с 'BundleTable.EnableOptimizations = true;' и не испытывал проблем с его запуском, хотя стоит знать, что я использую пару месяцев SlickGrid, кроме того, что остальное не изменилось. – ghiscoding

+0

Я использую SlickGrid версии 2.2.20140120. В общем, сбор и минимизация работы прекрасна. Проблема возникает только в одном конкретном случае, т. Е. При установке функции фильтрации (например, 'dataView.setFilter (filter)'). В реализации SlickGrid реализованы некоторые оптимизации в отношении функции фильтра. Возникновение ошибки также зависит от реализации функции фильтра. Как я уже писал, я решил проблему, не позволяя минимизировать функцию фильтра. –