2013-02-04 17 views
5

Tôi có lưới kendo trên trang web của mình và tôi đang cố gắng lưu các bộ lọc lưới bằng cách sử dụng sessionStorage và điều này đang hoạt động cho phần lớn.Kendo - lưu các bộ lọc lưới thông qua mã trên trang chỉ có vấn đề với các cột lưới lọc ngày

Vấn đề tôi gặp phải là khi tôi đặt bộ lọc vào cột ngày, khi tôi cố gắng áp dụng lại bộ lọc đó khi người dùng điều hướng trở lại trang đó, nó sẽ bị lỗi ở một trong các chức năng ẩn danh b/c phương thức toLowerCase() không tồn tại. Bộ lọc hoạt động tốt nếu tôi lọc trên cột chuỗi. Tôi có thể áp dụng nhiều bộ lọc và lưu chúng vào một biến số sessionStorage và áp dụng lại cho lưới vừa tốt. Chỉ với các cột ngày tôi có vấn đề.

Tôi đã mất một thời gian để tìm ra cách để có được những lưới kendo lọc bằng cách sử dụng cú pháp:

var theKgridFilters = $("#gridList").data("kendoGrid").dataSource.filter(); 

Sau đó để lưu trữ nó trong một var sessionStorage, tôi đã phải stringify() đối tượng hoặc nếu không nó sẽ không tổ chức các bộ lọc lưới trong var rằng:

sessionStorage.setItem('theGridFilters', JSON.stringify(theKgridFilters)); 

Tiếp theo, để áp dụng lại bộ lọc trên lưới, tôi đã phải chuyển đổi chuỗi lại một đối tượng JSON b/c bộ lọc là một đối tượng với các thuộc tính, vì vậy tôi sử dụng điều này:

if (sessionStorage.theGridFilters) {        
    gridFilter = sessionStorage.theGridFilters; 
    gridFilter = $.parseJSON(gridFilter); 
} 

nào được áp dụng cho các thuộc tính lưới lọc dataSource:

filter: gridFilter, 

Khi tôi lọc lưới trên một cột ngày, lỗi ném trên đường dây này dưới đây:

function anonymous(d, __f, __o) { 
    return (d.Last_Modified_Date.toLowerCase() == '2013-01-25t06:00:00.000z') 
} 

Trường hợp trường có bộ lọc là Last_Modified_Date. Tôi khá mới để làm việc với jQuery, JS, vv, và từ những gì tôi đã đọc, các fns vô danh() được tạo ra trên bay, vì vậy tôi không tin rằng tôi có thể thay đổi điều này.

Tôi đã kiểm tra trực tuyến và ai đó đã đề cập thêm toString() chức năng trước toLowerCase(). Tôi đã thử nó trong trình gỡ lỗi và nó đã làm việc nhưng tôi không chắc chắn làm thế nào để truy cập thông qua mã để thực hiện thay đổi đó. Có vẻ như hàm nặc danh được gọi từ tệp kendo.web.js dựa trên ngăn xếp cuộc gọi của trình gỡ lỗi IE.

Ngoài ra, giá trị của các trường ngày trong trình gỡ lỗi được hiển thị dưới đây:

d.Last_Modified_Date Wed Jan 25 00:00:00 CST 2013 Object, (Date) 

Vì vậy, tôi thậm chí không chắc chắn nếu nó có thể đánh đồng mà giá trị cho chuỗi trong fn giấu tên ở trên, đó là : '2013-01-25t06:00:00.000z'.

Hãy cho tôi biết nếu có ai có bất kỳ thông tin chi tiết nào để tránh xung quanh bộ lọc ngày này, hãy lưu sự cố. Nó khiến tôi như phát điên. Có thể có một cách khác mà tôi không biết để lưu các bộ lọc lưới.

Xin cảm ơn trước, Bruce!

+0

như thế nào LAST_MODIFIED_DATE định nghĩa trong 'schema.model'? Bạn đã định nghĩa nó là 'date' chưa? – OnaBai

+0

Xin chào OnaBai, vâng, nó được định nghĩa là ngày: Last_Modified_Date: {type: "date", editable: false}, –

+0

Cảm ơn vì đã cho tôi ý tưởng sử dụng sessionStorage. – friend

Trả lời

5

Lý do bạn quan sát hành vi này là JSON.parse không tạo đối tượng Ngày JavaScript. Nó tạo ra các chuỗi thay thế:

typeof $.parseJSON(JSON.stringify(new Date())); // "string" 

Khuôn khổ giao diện người dùng Kendo sau đó cố gắng lọc ngày tháng thành chuỗi do lỗi.

Cách giải quyết là sử dụng chỉ định một reviver:

function dateReviver(key, value) { 
    var a; 
    if (typeof value === 'string') { 
     a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); 
     if (a) { 
      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], 
          +a[5], +a[6])); 
     } 
    } 
    return value; 
} 

gridFilter = JSON.parse(gridFilter, dateReviver); 
+0

Chà, cảm ơn Atanas Korchev !!! Tôi sẽ không bao giờ nghĩ ra điều đó. Không bao giờ nghe nói về một fiver reviver trước này, vì vậy tôi sẽ cần phải đọc lên cho chắc chắn. Ngoài ra, trong mã bạn đã cung cấp ở trên, nếu tôi thay thế JSON.parse bằng $ .parseJSON(), nó sẽ bị lỗi cho cùng một lỗi, nhưng việc sử dụng JSON.parse chỉ hoạt động tốt. Tôi nghĩ rằng tôi thấy rằng $ .parseJSON() gọi JSON.parse, nhưng dù sao đi chăng nữa, tôi rất vui vì tôi đã làm việc này. Mất khoảng 2 ngày để cố gắng tìm ra. Cảm ơn một lần nữa, nhiều đánh giá cao! –

+1

Ok, tôi đã đọc thêm một chút và lấy fn của trình hồi sinh cho phương thức JSON.parse() ngay bây giờ. Nó giúp chuyển dữ liệu của bạn. Chỉ có tham số hồi sinh tùy chọn cho phương thức JSON.parse() chứ không phải cho phương thức $ .parseJSON() và đó là lý do tại sao nó không hoạt động với $ .parseJSON(). http://msdn.microsoft.com/en-us/library/ie/cc836466(v=vs.94).aspx –

+0

Đây là công cụ tuyệt vời !!! Không bao giờ có thể hình dung ra điều này. Cám ơn hai bạn! – friend