0

データベースから一連のエントリを取得し、それらを変数に格納してから、さまざまな基準に基づいて別の変数にフィルタリングしています。フィルター処理されたバージョンに基づいて Kendo Chart が初期化されると、最初の変数のエントリの日付形式が何らかの形で変更されますが、コードはそれらが元の形式であると想定しています。問題を 1 行まで追跡しましたが、その行が必要です。

ASP.NET MVC4 で C# を使用しています。

データを取得する ajax 呼び出しは次のとおりです。

$.ajax({
    // gets request logs
    url: 'Usage/GetLogs',
    dataType: 'json',
    success: function (data, status, xhr) {
        window.logs = data;
    },
    error: function (xhr, status, error) {
        alert('Error in GetLogs: ' + status);
    }
});

これは正常に実行され、logs配列には約 2000 個の Json オブジェクトが含まれており、それぞれ次のようになります。

CalcId: 129
Date: "/Date(1373432400000)/"
DateTime: "/Date(1373432621070)/"
Id: 1
ProvId: 2

次に、次の関数が呼び出されますfirstfilter = true

function FilterLogs(firstfilter) {
    window.currentlogs = [];
    for (var i = 0; i < logs.length; i++) {
        if (parseInt(logs[i].Date.substring(6)) >= Date.parse(StartDate)
         && parseInt(logs[i].Date.substring(6)) <= Date.parse(EndDate)
         && $('#ProvCheckBox' + logs[i].ProvId).hasClass('visible')
         && $('#ProvCheckBox' + logs[i].ProvId).prop('checked')
         && $('#CalcCheckBox' + logs[i].CalcId).prop('checked'))
            currentlogs.push(logs[i]);
    }
    if (firstfilter)
        InitializeOutput();
    else
        UpdateOutput();
}

これは、最初に呼び出されたときに正常に機能します。parseInt(logs[i].Date.substring(6))プロパティから数値をDate取得すると、比較が機能します。指定された日付範囲内で、Calc および Prov チェックボックスがオンになっているすべてのログが にプッシュされcurrentlogsます。次にInitializeOutput呼び出されます:

function InitializeOutput() {
    $('#DateChart').kendoChart({
        dataSource: {
            data: currentlogs,
            schema: {
                model: {
                    fields: {
                        Id: { type: "number" },
                        //Date: { type: "date" }
                        //This is the problematic line of code
                    }
                }
            }
        },
        series: [{
            type: "column",
            aggregate: "count",
            field: "Id",
            categoryField: "Date"
        }],
        categoryAxis: {
            baseUnit: "months",
            majorGridLines: {
                visible: false
            }
        }
    });
}

のコメントを外すとDate: { type: "date" }、次にFilterLogsが呼び出されたときDateに、 に含まれる各 Json オブジェクトでプロパティが変更されていますlogs。それらは次のようになります。

CalcId: 129
Date: Wed Jul 10 2013 00:00:00 GMT-0500 (Central Daylight Time)
DateTime: "/Date(1373432621070)/"
Id: 1
ProvId: 2

ステートメントに到達するとすぐにif (parseInt(logs[i].Date.substring(6))、次のメッセージが表示されます: Uncaught TypeError: Object [object Date] has no method 'substring'.

しかし、そのコード行のコメントを外す必要があります。コメントがないとbaseUnit"days". "weeks"orの指定は無視され、グラフには日が表示されます"months""years"

のすべてのインスタンスをcurrentlogsローカル変数に変更してから、フィルタリングが完了したらtemplogsコピーtemplogsしてみました。また、その内部からではなく、完了後に呼び出したので、「templogs」がチャートが作成される時間で、同じ結果が得られます。currentlogsInitializeOutputFilterLogs

興味深いことに、(表示されていない) 剣道 DatePicker の開始値を変更して、日付範囲内にログがないようcurrentlogsにし、最初の呼び出しで空のままにしてからFilterLogs、日付範囲を開くと、何も取得されません。問題。pushしかし、コードをステップ実行し、実行logs後も正常なままであるため、問題はないと思いますpush

何が起こっている?

コード内の他のすべてが正常に機能するため、私が行っている方法で日付を処理し続けたいと思います。logsにしか接続されていないのに、剣道がめちゃくちゃになるのはなぜcurrentlogsですか?

4

1 に答える 1

0

私はそれを修正したように見えます。currentlogs.push(logs[i])コピーを作成するのではなく、json オブジェクトへの参照をプッシュしていたと思います。次のように変更しました。

currentlogs.push({
    Date: logs[i].Date,
    DateTime: logs[i].DateTime,
    ProvId: logs[i].ProvId,
    CalcId: logs[i].CalcId
});

そしてそれは今動作します。

于 2013-10-14T14:14:33.080 に答える