1

<compilation debug="true" />이 설정 될 때까지 웹 응용 프로그램이 번들 된 스크립트로 정상적으로 작동합니다. 디버깅을 false으로 설정하면 사용자 정의 스크립트가 축소되어 작동을 멈 춥니 다.디버깅이 비활성화 된 경우 번들링으로 축소 된 스크립트가 ASP.NET MVC 3에서 작동하지 않습니다.

F12 도구를 사용하여 모든 브라우저에서 오류를 재현 할 수 있습니다. 오류없이 전체 JavaScript 변수의 이름이 올바른지 확인했습니다. 유일하게 눈에 띄는 차이점은 스크립트가 축소되어 지역 변수 이름이 마찬가지로 매개 변수 이름이 변경되어 아무 것도 손상시키지 않아야한다는 것입니다. 나는 번들되고 축소 된 다른 커스텀 스크립트도 가지고 있으며 제대로 작동한다.

나는 이것이 어리 석다라고 생각한다. 나는 JavaScript에서 전문가가 아니며 어쩌면 내가 당신에게 명백한 것을 놓친 것일 수도있다. 문제의 원인을 찾는 방법을 알려주시겠습니까? depper 디버깅 후에

감사 RYSZARD

답변

1

당신은 이미 문제 영역은 compileFilter,하지만 질문을했고이 게시물 날 근본 원인을 파악 도왔 것을 알아 냈 : https://github.com/mleibman/SlickGrid/issues/244

내 생각 엔 : 슬릭 그리드의 저자는 당신이 얻을 수 options.inlineFilters = false를 사용하는 것이 선호 이 주변.

나는이 문제는 ASP.NET에서 번들 것은 사용되었을 때 발생 이유를 이해 원했고, 이걸 발견 :

return truereturn falsereturn!0return!1로 대체됩니다 ASP.NET 번들링 및 축소에서는,을 사용하여, 각기.

(당신이 Bundle.Transforms.Clear()를 호출 할 경우에도이 문제가 발생)

슬릭 그리드의 compileFiltercompileFilterWithCaching 기능 루프 구조의 내부에 필터 기능을 재 작성 정규식을 사용하려고하고 continue 문에 return 문을 변경합니다.

번들링에서 필터 기능을 제거한 솔루션도 나에게 효과적 이었지만 번들링을 사용하는 데 예외가 없기 때문에 대신 slick.dataview.js (v2.2)를 수정하여 ASP 용 대체품을 처리했습니다. .NET 번들 :

나는 compileFiltercompileFilterWithCaching이 두 줄을 추가 : 그래서

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"); 

가 지금은 모든 번들로 계속되었다

.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 

내 스크립트를 사용하여 ASP.NET B & M, 그리고 매끄러운 격자 행복합니다.

업데이트 : compileFilterWithCaching은 실제로 캐시 추가 단계로 인해 약간 다릅니다. function compileFilterWithCaching()에 업데이 트를 수정입니다 : 내가 GitHub의에서이 변화에 대한 풀 요구를 고려 중이 야하지만 ... TBD 번들 ASP.NET을 처리하는 여부에 대한 옵션을 추가 할 수 먼저 조금을 개정 할 수 있습니다

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 페이지에이 문제를 게시했습니다 : https://github.com/mleibman/SlickGrid/issues/1053

+0

나는 그렇게 정교하지 않았다 :) 대답을 수락했다. 잘 했어! –

1

는이 compileFilter 함수 slick.dataview.js 스크립트 에러 원인을 발견 하였다. 내 페이지에 SlickGrid을 사용하고 Slick.Data.DataView 개체에 필터를 설정합니다. compileFilter 함수는 제공된 필터 함수에 대해 하드 코딩 된 문자열 대체를 수행합니다.이 함수는 필터 함수가 번들로 제공되고 릴리스 코드에서 축소 될 때 실패합니다.

필터 기능을 축소 된 스크립트 밖으로 옮겼습니다. 그것은 그 문제를 해결했습니다.

+0

아시다시피, 저는 (SlickGrid를 포함하여) 코드를 축소하고 있으며 어떤 문제도 없습니다. 나는 ASP.MVC를'BundleTable.EnableOptimizations = true; '와 함께 사용하고 아무런 문제없이 실행했다.하지만 몇 달 전의 SlickGrid를 사용한다는 것을 알았지 만 나머지는 변경되지 않았다. – ghiscoding

+0

2.2.20140120 버전의 SlickGrid를 사용하고 있습니다. 일반적으로 번들 링 및 축소 작업이 정상적으로 작동합니다. 문제는 하나의 특별한 경우, 즉 필터 함수 (예 :'dataView.setFilter (filter)')를 설정하는 경우에만 발생합니다. SlickGrid 구현 내에서 필터 기능에 대해 최적화가 적용되었습니다. 오류 발생은 필터 함수 구현에 따라 달라집니다. 필자가 작성한 것처럼 필자는 필터 기능을 축소하지 않도록하여이 문제를 해결했습니다. –