2013-02-22 24 views
7

Khi tôi chạy dự án MVC 4 trong chế độ Phát hành, một trang sử dụng SlickGrid không hiển thị chính xác (lưới rất, rất cao và ô lưới bị thiếu).Tại sao Mã được Rút gọn không tương đương với Bản gốc?

Tuy nhiên, tôi không nghĩ đây là vấn đề của SlickGrid, nhưng thay vì cách trình bao (System.Web.Optimization được tích hợp vào MVC 4), hãy rút ngắn mã.

Tôi đã chụp JavaScript được rút gọn và bắt đầu đảo chiều giảm thiểu ở một khu vực tại một thời điểm cho đến khi sự cố được khắc phục. Tôi thấy rằng việc thay đổi (và tha thứ cho sự di chuyển, tôi muốn rời khỏi phiên bản minified chính xác như nó vốn có)

function SlickFilter(n,t){var i=n.option,r=t.searchString;return n.pctSortKey.key<t.percentCompleteThreshold||r!=""&&i.indexOf(r)==-1&&i!="Unweighted Response"&&i!="Median"&&i!="Average"?!1:!0} 

với bản gốc

function SlickFilter(item, args) { 
    if (item.pctSortKey.key < args.percentCompleteThreshold) { 
     return false; 
    } 

    if (args.searchString != "" && item.option.indexOf(args.searchString) == -1 && item.option != "Unweighted Response" && item.option != "Median" && item.option != "Average") { 
     return false; 
    } 

    return true; 
} 

giải quyết vấn đề này nếu tất cả các yếu tố khác của các tập tin được rút gọn không đổi.

Hàm này được dùng như:

dataView.setFilter(SlickFilter); 

để cung cấp một chức năng gọi lại cho SlickGrid để lọc ra các kết quả nhất định.

Làm thế nào mà hàm gốc và hàm được rút gọn không tương đương?

CẬP NHẬT

SlickGrid là "biên dịch" chức năng lọc mà tôi cung cấp. Bước biên dịch đó không thành công với phiên bản được rút gọn. Mã minified biên soạn trông giống như:

function anonymous(_items,_args) { 
var _retval = [], _idx = 0; var n, t = _args; _coreloop: for (var _i = 0, _il = _items.length; _i < _il; _i++) { n = _items[_i]; 
    //debugger; 
    var i = n.option, 
     r = t.searchString; 

    return 
    n.pctSortKey.key < t.percentCompleteThreshold 
    || 
    r !="" 
     && i.indexOf(r)==-1 
     && i != "Unweighted Response" 
     && i != "Median" 
     && i != "Average" 
? !1 
: !0 
; } return _retval; 
} 

Lưu ý nhiều trở báo cáo.

Với cái nhìn sâu sắc bổ sung này, tôi đã có thể xác định một SlickGrid lỗi liên quan:

https://github.com/mleibman/SlickGrid/issues/301

+0

Bạn đang tự mình làm nhỏ js?Có rất nhiều công cụ khai thác trên mạng nên tôi khuyên bạn nên thử một công cụ khác. – lolol

+0

@lolol: Không, tôi đang sử dụng 'System.Web.Optimization' được tích hợp vào MVC 4. Cập nhật câu hỏi để làm rõ điều đó. –

+0

Tệ của tôi, tôi thực sự không thể giúp bạn sau đó. Lấy làm tiếc. (Tôi có vấn đề tương tự, nhưng tôi đã tự mình làm, thay đổi công cụ đã giải quyết được vấn đề) – lolol

Trả lời

4

Một khác biệt tôi thấy là item.option và args.searchString đang được đánh giá ngay cả khi điều kiện đầu tiên là đúng khi họ không có trong mã ban đầu.

Bạn đã thử bước vào mã để xem giá trị là gì và nó hoạt động như thế nào?

Dưới đây là mã rút gọn chưa được sửa đổi để lưu bất kỳ ai khác làm như vậy hoặc nếu bạn muốn thử và thực hiện nó.

function SlickFilter(n,t) { 
var i = n.option, 
    r = t.searchString; 

return 
     n.pctSortKey.key < t.percentCompleteThreshold 
     || 
     r !="" 
      && i.indexOf(r)==-1 
      && i != "Unweighted Response" 
      && i != "Median" 
      && i != "Average" 
    ? !1 
    : !0 
} 

EDIT (bởi OP)

này đã cho tôi trên con đường đúng đắn, nhưng nó chỉ ra rằng SlickGrid là "biên dịch" chức năng lọc. Có một vấn đề được biết rằng trình biên dịch đôi khi thất bại. Thật sự biên dịch là tùy chọn và không cần thiết trong trường hợp này vì bộ khai thác đã tạo ra mã được tối ưu hóa.

https://github.com/mleibman/SlickGrid/issues/301

+0

Tôi ở cùng bạn - đó là sự khác biệt duy nhất tôi thấy. Nhưng sự khác biệt về việc đánh giá hai mục đó sẽ không có bất kỳ hiệu ứng nào - chúng chỉ trả về các giá trị, vì vậy không có mã nào thực sự thực thi bất kỳ cách nào khác. Ngay cả khi họ không tồn tại, họ sẽ chỉ trở lại không xác định, và mã sẽ tiếp tục. Chữ '||' ngắn mạch có nghĩa là các giá trị của 'i' và' r' sẽ không bao giờ được sử dụng trừ khi dòng đầu tiên không xảy ra, cũng giống như khi chúng là các câu lệnh 'if' riêng biệt. –

+0

Có vẻ như dấu ngoặc đơn đúng sẽ sửa chữa đúng không ?, từ trở về? – technosaurus

+0

Đối với bản ghi, phiên bản được định dạng này thể hiện hành vi tương tự như phiên bản tôi đã đăng. Bây giờ tôi đang gỡ lỗi để tìm các tác dụng phụ dựa trên đề xuất của bạn. Tôi sẽ cho bạn biết! –

Các vấn đề liên quan