【问题标题】:chartjs & asp.net: Cannot read property 'labels' of undefinedchartjs & asp.net:无法读取未定义的属性“标签”
【发布时间】:2020-03-04 19:29:27
【问题描述】:

我已经浏览了有关此问题的所有帖子,但我无法解决它。

我的 chartjs 折线图创建得很好。我正在尝试测试更新它(添加数据),但我被困在 chart.data.labels.push(labels) 上,因为它指出对象在控制台中未定义。然而在控制台上,前一行,我写了对象的 id,它是正确的,所以它有 ref。

有什么想法吗?

图表创建良好

$(function () {
    LoadChart();
});

function LoadChart() {
    var ctx = document.getElementById('myChart');
    var myChart = new Chart(ctx, {
        type: 'line',
        data: {
            labels: ['9:30', '9:31', '9:32', '9:33', '9:34', '9:35'],
            datasets: [{
                label: 'RSI',
                data: [12, 19, 3, 5, 2, 3],
                borderWidth: 1
            }]
        },
        options: {
           title: {
                display: true,
                text: 'Custom Chart Title'
            }
        }
    });
}

尝试更新图表时出错

$.connection.redisHub.client.addData = function (chartID, labels, data) {
    var chart = document.getElementById(chartID);
    console.log("chart: " + chart.id);
    chart.data.labels.push(labels);
    chart.data.datasets.forEach((dataset) => {
        dataset.data.push(data);
    });
    chart.update();
}

控制台输出 您可以看到它正确地将“图表:myChart”写入控制台,显示我们有对象 ref。正确的。

asp代码调用js函数(这里一切正常)

string[] labels = { "9:36", "9:37" };
int[] data = { 9, 10 };
Clients.All.addData("myChart", labels, data); 

html : 一切顺利

<div class="col-sm-8">
    <canvas id="myChart" width="400" height="200"></canvas>
</div>

提前谢谢你

【问题讨论】:

  • 是的,我通过了那个帖子,他的错误在于他创建初始图表的顺序。这是不同的,因为我已经正确创建了初始图表,现在正尝试向其中“添加”数据,并且我之前在该行上有对象引用。我尽我所能搜索以前的帖子,谢谢
  • 好的,你能在 var chart = document.getElementById(chartID); 中添加一个console.log(labels)吗? console.log("图表:" + chart.id); chart.data.labels.push(labels);
  • 是的会尝试并报告谢谢你...标签是我传递的数据,你的意思是chart.data.labels
  • console.log(labels) 输出我正确传递的数据: Array(2) 0: "9:36" 1: "9:37" length: 2 & console.log(chart) 的相同错误.data.labels);

标签: javascript c# html asp.net chart.js


【解决方案1】:

var chart = document.getElementById(chartID);会返回canvas元素,它不是Chart.js的实例,所以后面的代码都是无效的。

您需要使用 LoadChart() 函数中的 myChart,因为这是一个 Chart.js 实例(在实例化时返回)。执行此操作的最简单方法是将变量定义移动到更高的范围,以便您的更新函数可以使用它。

如果不知道代码的结构,很难给出一个可行的例子,但这里有一个简单的例子来说明我的意思:

var myChart;

$(function () {
    LoadChart();
});

function LoadChart() {
    var ctx = document.getElementById('myChart');
    myChart = new Chart(ctx, {
        type: 'line',
    ...
}

$.connection.redisHub.client.addData = function (chartID, labels, data) {
    myChart.data.labels.push(labels);
    ...
}

【讨论】:

  • 做到了!但是,如果我有多个图表,比如 myChart1、myChart2 ......我如何通过 chartID 在 addData 函数中选择我想要的图表?谢谢!
  • @MX313 假设chartID 已经作为canvas 元素的id 属性传递(基于您的代码),那么您也许可以将图表引用存储在一个数组中,例如var charts = [];,然后是 charts["myChart"] = new Chart...。然后通过charts[chartID].data...访问正确的图表。
猜你喜欢
  • 1970-01-01
  • 2022-07-15
  • 2021-05-25
  • 2021-02-15
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
相关资源
最近更新 更多