データベースから一連のエントリを取得し、それらを変数に格納してから、さまざまな基準に基づいて別の変数にフィルタリングしています。フィルター処理されたバージョンに基づいて 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」がチャートが作成される時間で、同じ結果が得られます。currentlogs
InitializeOutput
FilterLogs
興味深いことに、(表示されていない) 剣道 DatePicker の開始値を変更して、日付範囲内にログがないようcurrentlogs
にし、最初の呼び出しで空のままにしてからFilterLogs
、日付範囲を開くと、何も取得されません。問題。push
しかし、コードをステップ実行し、実行logs
後も正常なままであるため、問題はないと思いますpush
。
何が起こっている?
コード内の他のすべてが正常に機能するため、私が行っている方法で日付を処理し続けたいと思います。logs
にしか接続されていないのに、剣道がめちゃくちゃになるのはなぜcurrentlogs
ですか?