为什么我的 KendoUI 图表在它甚至没有连接的 javascript 变量中更改日期格式?以及如何让它停止

Why is my KendoUI Chart changing the date format in a javascript variable it's not even connected to? And how to make it stop?

本文关键字:格式 日期 javascript KendoUI 我的 为什么 连接 变量      更新时间:2023-09-26

我从数据库中提取一堆条目,将它们存储在变量中,然后根据各种条件将它们过滤到单独的变量中。一旦我的剑道图表初始化,基于过滤版本,它会以某种方式更改第一个变量中条目的日期格式,但我的代码希望它们采用原始格式。我已经将问题追踪到一行,但我需要那行。

我在 MVC4 中使用 ASP.NET 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 时,logs 中包含的每个 Json 对象中的 Date 属性已更改。它们现在看起来像这样:

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))语句,我就会得到以下内容:未捕获的类型错误:对象 [对象日期] 没有方法"子字符串"。

但是我需要那行代码不加注释,因为没有它,我就无法baseUnit做除"days"以外的任何事情。指定"weeks""months""years"将被忽略,图表将显示天数。

我尝试将所有currentlogs实例更改为局部变量templogs,然后在过滤完成后templogs复制到currentlogs中,并且我还在FilterLogs完成后调用InitializeOutput,而不是从内部调用,因此在创建图表时"临时日志"甚至不应该存在,我得到了相同的结果。

有趣的是,如果我更改(未显示(kendo DatePickers 的起始值,以便日期范围内没有日志,并且currentlogs在第一次FilterLogs调用时保持为空,然后我打开日期范围,我不会遇到任何问题。但我不认为push问题,因为我已经逐步完成了代码,并且在执行pushlogs保持正常。

这是怎么回事?

我想继续以我的方式处理日期,因为代码中的其他所有内容都可以正常工作。为什么剑道只挂在currentlogs上时会用logs拧紧?

看起来我修复了它。我认为currentlogs.push(logs[i])是在推送对 json 对象的引用,而不是复制它。将其更改为:

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

它现在有效。