2013-02-04 2 views
5

Ich habe ein Kendo Raster auf meiner Webseite und ich versuche, die Rasterfilter mit der sessionStorage programmatisch zu speichern und dies funktioniert für die der größte Teil.Kendo - Speichern Gitterfilter über Code auf der Seite hat Probleme nur mit dem Datum Filterraster Spalten

Das Problem, das ich habe ist, dass, wenn ich einen Filter auf eine Datumsspalte platzieren, wenn ich versuche, den Filter erneut anzuwenden, wenn der Benutzer zurück zu dieser Seite navigiert, es in einer der anonymen Funktionen ausfällt b/c Die toLowerCase() Methode existiert nicht. Der Filter funktioniert einwandfrei, wenn ich nach einer String-Spalte suche. Ich kann mehrere Filter anwenden und sie in einem sessionStorage var speichern und in das Raster gerade gut wieder anwenden. Nur mit Datumsspalten habe ich Probleme.

Es dauerte eine Weile, um herauszufinden, wie das Kendo-Raster, um die Syntax-Filter zu erhalten:

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

Dann ist es zu speichern, in einer sessionStorage var, ich stringify() hatte das Objekt oder sonst wäre es nicht halten die Gitterfilter in diesem var:

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

nächstes den Filter auf dem Gitter erneut anzuwenden, musste ich die Zeichenfolge zurück zu einem JSON Objekt konvertieren b/c der Filter ist ein Objekt mit Attributen, so habe ich dies:

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

, die an die Gitter Datasource Filter Attribut angewendet wird:

filter: gridFilter, 

Als ich das Gitter auf einer Datumsspalte filtern, die Fehler auf dieser Linie wirft unter:

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

Wo die Feld mit dem Filter ist Last_Modified_Date. Ich bin ziemlich neu in der Arbeit mit jQuery, JS, etc., und von dem, was ich gelesen habe, die anonymen() fns werden im laufenden Betrieb erstellt, also glaube ich nicht, dass ich das ändern kann.

Ich überprüfte online und jemand erwähnt, um toString() Funktion vor der toLowerCase() hinzuzufügen. Ich habe es im Debugger ausprobiert und es hat funktioniert, aber ich bin mir nicht sicher, wie ich über den Code auf diese Änderung zugreifen kann. Es sieht so aus, als ob die anonyme Funktion aus der Datei kendo.web.js basierend auf dem Aufruf-Stack des IE-Debuggers aufgerufen wird.

Auch wird der Wert des Datumsfeld im Debugger unten gezeigt:

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

Also ich bin nicht einmal sicher, ob es über diesen Wert auf den String in der anonymen fn gleichsetzen kann, das ist : '2013-01-25t06:00:00.000z'.

Bitte lassen Sie mich wissen, wenn jemand irgendwelche Einsichten hat, um dieses Datum Filter Problem zu umgehen. Es macht mich wahnsinnig. Vielleicht ist mir eine andere Möglichkeit nicht bekannt, die Rasterfilter zu speichern.

Vielen Dank im Voraus, Bruce!

+0

Wie wird LAST_MODIFIED_DATE im 'schema.model' definiert? Haben Sie es ausdrücklich als "Datum" definiert? – OnaBai

+0

Hallo OnaBai, ja es ist als Datum definiert: Last_Modified_Date: {Typ: "Datum", editierbar: falsch}, –

+0

Danke, dass Sie mir die Idee gegeben haben, sessionStorage zu verwenden. – friend

Antwort

5

Der Grund, warum Sie dieses Verhalten beobachten, ist, dass JSON.parse keine JavaScript-Date-Objekte erstellt. Es werden stattdessen Zeichenfolgen erstellt:

Das Kendo-UI-Framework versucht dann Daten als Zeichenfolgen daher den Fehler zu filtern.

dieses Problem umgehen, geben Sie verwenden ein 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, vielen Dank Atanas Korchev !!! Das hätte ich nie herausgefunden. Ich habe noch nie zuvor von einem Reviver-Fn gehört, also muss ich es auf jeden Fall nachlesen. Wenn ich JSON.parse durch $ .parseJSON() ersetze, wird in dem oben angegebenen Code derselbe Fehler ausgegeben, aber die Verwendung von JSON.parse funktioniert einwandfrei. Ich glaube, ich habe gesehen, dass $ .parseJSON() JSON.parse aufruft, aber ich bin einfach nur glücklich, dass es funktioniert. Nahm mich etwa 2 Tage um zu versuchen, herauszufinden. Danke nochmal, sehr geschätzt! –

+1

Ok, ich lese ein wenig mehr und bekomme jetzt den reviver fn für die JSON.parse() Methode. Es hilft, Ihre Daten zu übertragen. Es gibt nur den optionalen reviver-Parameter für die JSON.parse() -Methode und nicht für die $ .parseJSON() -Methode, und deshalb funktionierte sie nicht mit $ .parseJSON(). http://msdn.microsoft.com/en-us/library/ie/cc836466(v=vs.94).aspx –

+0

Das ist geniales Zeug !!! Konnte das nie herausfinden. Danke euch beiden! – friend

Verwandte Themen