访问模块中的对象属性时出错

时间:2018-02-08 10:33:20

标签: javascript ecmascript-6 es6-class es6-modules

我目前正在使用JavaScript模块运行一些测试,遗憾的是,在尝试设置mychart对象的属性setOption时出现Uncaught TypeError错误。这作为参数传递给另一个模块中的类。当前代码如下所示:

App.js

import {   echart,   theme,   option } from './module-chart';

import {   ChartController } from './module-chart-controller';

let mychart = echart.init(document.getElementById('main'), theme); 
mychart.setOption(option);

let chartController = new ChartController(mychart); 
chartController.animateChart();

模块图表-controller.js

class ChartController{

  constructor(chart){
    this.mychart = chart;
  }

  animateChart() {
    let intervalo = setInterval(function() {
      concentrationOfAandB = getObjectConcentrationOfAandB();
      dataA.push(concentrationOfAandB.concentrationOfA);
      dataB.push(concentrationOfAandB.concentrationOfB);
      this.mychart.setOption({
        series: [{
            data: dataA,
            animationDuration: 1000
          },
          {
            data: dataB,
            animationDuration: 1000
          }
        ]
      });
    }, 1900);
    setTimeout(function() {
      clearInterval(intervalo);
    }, 40000);
  }
}
export {ChartController};

当我在App.js文件中传递module-chart-controller.js代码时,不会发生错误。

控制台上显示以下错误消息:未捕获TypeError:无法读取属性' setOption'未定义。在module-chart-controller.js文件中指出错误

提前感谢您的关注!

1 个答案:

答案 0 :(得分:0)

您需要bind请求分配给this的属性的方法,因此该方法可以访问它们。您需要执行setInterval功能,它需要访问this,因此您也需要bind

constructor(chart){
    this.mychart = chart;
    this.animateChart = this.animateChart.bind(this);
}

animateChart() {
    let intervalo = setInterval(function() {
       concentrationOfAandB = getObjectConcentrationOfAandB();
       dataA.push(concentrationOfAandB.concentrationOfA);
       dataB.push(concentrationOfAandB.concentrationOfB);
       this.mychart.setOption({
           series: [{
               data: dataA,
               animationDuration: 1000
           },
           {
               data: dataB,
               animationDuration: 1000
           }]
       });
    }.bind(this), 1900);

    setTimeout(function() {
        clearInterval(intervalo);
    }, 40000);
}