5

Webページに剣道グリッドがあり、を使用してグリッドフィルターをプログラムで保存しようとしていますがsessionStorage、これはほとんどの部分で機能しています。

toLowerCase()私が抱えている問題は、日付列にフィルターを配置したときに、ユーザーがそのページに戻ったときにそのフィルターを再適用しようとすると、メソッドが行う匿名関数の1つでエラーが発生することです存在しない。文字列列でフィルタリングしている場合、フィルターは正常に機能します。複数のフィルターを適用してそれらを変数に保存しsessionStorage、グリッドに再適用することができます。日付列でのみ問題が発生します。

次の構文を使用して剣道グリッドフィルターを取得する方法を理解するのに少し時間がかかりました。

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

sessionStorage次に、それをvarに格納するためにstringify()、オブジェクトを作成する必要がありました。そうしないと、そのvarにグリッドフィルターが保持されません。

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

次に、グリッドにフィルターを再適用するために、文字列をJSONオブジェクトに変換し直す必要がありました。フィルターは属性を持つオブジェクトであるため、次のように使用しました。

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

グリッドのdataSourceフィルター属性に適用されるもの:

filter: gridFilter, 

日付列でグリッドをフィルタリングすると、次の行にエラーが表示されます。

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

フィルタがあるフィールドはですLast_Modified_Date。私はjQueryやJSなどを扱うのはかなり新しいですが、私が読んだことから、anonymous()fnsはその場で作成されるので、これを変更できるとは思いません。

私はオンラインでチェックし、誰かがtoString()前に関数を追加するように言ったtoLowerCase()。デバッガーで試してみましたが、機能しましたが、コードを介してこれにアクセスして変更を加える方法がわかりません。IEデバッガーのコールスタックに基づいて、kendo.web.jsファイルから無名関数が呼び出されているようです。

また、デバッガーの日付フィールドの値を以下に示します。

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

したがって、その値を上記の匿名fnの文字列(次の文字列)と同等にできるかどうかさえわかりません'2013-01-25t06:00:00.000z'

この日付フィルター保存の問題を回避するための洞察があれば教えてください。それは私を狂気に駆り立てています。グリッドフィルターを保存することに気付いていない別の方法があるかもしれません。

よろしくお願いします、ブルース!

4

1 に答える 1

5

この動作を観察している理由は、JSON.parseがJavaScriptDateオブジェクトを作成しないためです。代わりに文字列を作成します。

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

次に、Kendo UIフレームワークは、日付を文字列としてフィルタリングしようとするため、エラーが発生します。

回避策は、リバイバーを指定することです。

 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);
于 2013-02-05T08:21:05.010 に答える