0

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

我在 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属性已在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))语句,我就会得到以下信息:未捕获的类型错误:对象 [对象日期] 没有方法“子字符串”。

但是我需要取消注释那行代码,因为没有它,baseUnit除了"days". 指定"weeks""months"或被"years"忽略,图表显示天数。

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

有趣的是,如果我更改(未显示)kendo DatePickers 的起始值,以便在日期范围内没有日志,并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 回答