2013-02-04 17 views
5

Mam siatkę kendo na mojej stronie i próbuję programowo zapisać filtry siatki używając sessionStorage i działa to dla większość.Kendo - zapisywanie filtrów siatki za pomocą kodu na stronie ma problemy tylko z kolumnami siatki filtru daty

Problem, który mam, polega na tym, że gdy umieszczam filtr na kolumnie daty, gdy próbuję ponownie zastosować ten filtr, gdy użytkownik nawiguje z powrotem na tę stronę, powoduje to błąd w jednej z anonimowych funkcji b/c Metoda toLowerCase() nie istnieje. Filtr działa dobrze, jeśli filtruję kolumnę ciągów. Mogę zastosować wiele filtrów i zapisać je do wersji sessionStorage var i ponownie zastosować do siatki. Tylko z kolumnami daty mam problemy.

Zajęło mi trochę czasu, aby dowiedzieć się, jak dostać się filtruje siatka kendo używając składni:

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

Następnie do przechowywania go w sessionStorage var, musiałem stringify() obiektu albo nie będzie przytrzymaj filtrów sieciowych w tym var:

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

Następnie, aby ponownie zastosować filtr na siatce, musiałam przekonwertować ciąg z powrotem do obiektu JSON b/c filtr to obiekt z atrybutami, więc użyłem to:

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

który zostanie zastosowany do atrybutu siatki filtracyjnej DataSource:

filter: gridFilter, 

Kiedy filtrowanie siatkę na kolumnie data, błąd rzuca na tej linii poniżej:

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

gdzie pole z filtrem to Last_Modified_Date. Jestem całkiem nowy w pracy z jQuery, JS itp. Iz tego co przeczytałem, anonymous() fns są tworzone w locie, więc nie wierzę, że mogę to zmienić.

Sprawdziłem online i ktoś wspomniał o dodaniu funkcji toString() przed toLowerCase(). Próbowałem go w debugerze i działało, ale nie wiem, jak uzyskać do niego dostęp za pośrednictwem kodu, aby wprowadzić tę zmianę. Wygląda na to, że anonimowa funkcja jest wywoływana z pliku kendo.web.js na podstawie stosu wywołań debuggera IE.

Również wartość pola data w debugger przedstawiono poniżej:

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

Więc nie jestem nawet pewien, czy można go zrównać tę wartość do łańcucha w anonimowym fn powyżej, który jest : '2013-01-25t06:00:00.000z'.

Proszę dać mi znać, jeśli ktoś ma jakiś pomysł, aby obejść ten problem z filtrem daty. To doprowadza mnie do szaleństwa. Być może istnieje inny sposób, w jaki nie jestem świadom, aby zapisać filtry siatki.

Z góry dziękuję, Bruce!

+0

Jak LAST_MODIFIED_DATE zdefiniowane w 'schema.model'? Czy jawnie zdefiniowałeś go jako "date"? – OnaBai

+0

Cześć OnaBai, tak, jest zdefiniowana jako data: Last_Modified_Date: {type: "date", editable: false}, –

+0

Dziękuję za udzielenie mi pomysłu na użycie sessionStorage. – friend

Odpowiedz

5

Powodem, dla którego obserwujesz to zachowanie jest fakt, że JSON.parse nie tworzy obiektów Data JavaScript. Zamiast tego tworzy ciągi znaków:

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

Struktura UI Kendo próbuje filtrować daty w postaci ciągów, stąd błąd.

Rozwiązaniem jest użycie określenia 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

Wow, wielkie dzięki Atanas Korchev !!! Nigdy bym tego nie rozgryzł. Nigdy wcześniej nie słyszałem o odrodzeniu fn, więc będę musiał na pewno przeczytać. Również w powyższym kodzie, jeśli zamieniam JSON.parse na $ .parseJSON(), to powoduje błąd dla tego samego błędu, ale użycie JSON.parse działa dobrze. Myślę, że widziałem, że $ .parseJSON() wywołuje JSON.parse, ale w każdym razie, jestem po prostu szczęśliwy, że to działa. Zajęło mi około 2 dni, aby spróbować dowiedzieć się. Jeszcze raz dziękuję, doceniam! –

+1

Ok, czytałem trochę więcej i otrzymałem teraz reviver fn dla metody JSON.parse(). Pomaga przenieść twoje dane. Istnieje tylko opcjonalny parametr reviver dla metody JSON.parse(), a nie dla metody $ .parseJSON(), i dlatego nie działał on z $ .parseJSON(). http://msdn.microsoft.com/en-us/library/ie/cc836466(v=vs.94).aspx –

+0

To jest niesamowite rzeczy !!! Nigdy nie mogłem wymyślić tego. Dziękuję wam obu! – friend

Powiązane problemy