【问题标题】:"this" doesn't work in click event handler“this”在点击事件处理程序中不起作用
【发布时间】:2020-04-02 19:24:23
【问题描述】:

我已将点击事件处理程序附加到我的 ChartJS 派生组件,如下所示:

export default {
  extends: HorizontalBar,
  data() {
    return {
      my_data: [],
      options: {
        onClick: function(event, args) {
           //need to access my_data here
        }
      },
    };
  },
}

我需要在处理程序中访问我的data 成员之一。不幸的是,this.my_data 在这里不起作用。 ChartJS 文档告诉我这个事件是在 Chart 组件的上下文中调用的,而不是我的 Vue 组件。如何访问my_data

更新

所以我现在使用@Dan 的方式来定义处理程序:

export default {
  extends: HorizontalBar,
  data() {
    return {
      my_data: [],
      options: {
        onClick: this.ClickHandler,
      },
    };
  },

  methods: {
    ClickHandler: function(event, args) {
      var datapoint = this.getElementAtEvent(event);
      var value = this.my_data[datapoint._datasetIndex];
    },
  }
}

处理程序被正确调用,但 this 现在引用我的 Vue 组件,因此我没有引用 Chart 上下文来调用它的 getElementAtEvent

所以如果我在上面的onClick 前面声明它,我会在this 中获得图表上下文,但不再可以访问my_data。如果我使用你的方式,我会得到this.my_data,但会丢失图表上下文。

【问题讨论】:

  • @Stephen Thomas 的答案应该有效...您可以结合 Dan 的答案和他的答案,请参阅 closures 了解他的答案是如何工作的。

标签: javascript vue.js vuejs2 chart.js vue-chartjs


【解决方案1】:

您需要将处理程序放入您的methods 对象中,然后从图表options 处理程序中引用它:

data() {
  return {
    my_data: [],
    options: {
      onClick: this.ClickHandler,
    }
  };
},
methods: {
  ClickHandler: function(event, points) {
    // Here is how to access the chart
    const c = this._data._chart;
    const datapoint = c.getElementAtEvent(event)[0];
    const indexBar = datapoint._index;
    const indexSegment = datapoint._datasetIndex;
    // Do whatever with this.my_data, indexBar, and indexSegment
  }
}

组件可以通过this._data._chart访问图表。

【讨论】:

  • 这看起来很有希望,但我现在在onClick: 前面写什么呢?请注意,我需要 Chart 对象引用和 Vue 对象引用。请注意,我是在 JS 中附加事件处理程序,而不是通过 HTML 标记。
  • 你能展示一些相关的代码或模板吗?不清楚你还想实现什么
  • 图表上下文从何而来?在模板中查看您之前如何获取它会很有帮助。 (我从未看过 ChartJS,或者我可能对此有更好的理解。)
  • ChartJS 自动将此上下文传递给事件处理程序。它没有完整记录,但你可以看到一个简短的注释here
  • 就是这样! this._data._chart 是我需要的东西。像雨天的“garma-garam pikoray”一样美味。谢谢。
【解决方案2】:

创建一个闭包变量

data() {
    const vm = this;
    return {
      my_data: [],
      options: {
        onClick: function(event, args) {
           this.chartjs.something;
           vm.my_data[]
        }
      }
}

【讨论】:

  • 非常感谢。刚刚发现这和丹的回答一样好。不能选择多个答案,但这绝对值得一票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2017-02-20
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
相关资源
最近更新 更多