【问题标题】:Why aren't the changes to my variable being visible outside of this function?为什么我的变量的更改在此函数之外不可见?
【发布时间】:2016-01-19 02:43:54
【问题描述】:

以下代码是在 VueJS 实例中的 D3 片段。 sn-p 创建圆圈并让您拖动它们。

new Vue({
  el: 'body',

  data: {
    x: '',
    y: ''
  },

  computed: {
    pos: function () {
      function click() {

        var point = d3.mouse(this),
          p = { x: point[0], y: point[1] }

        svg.append('circle')
          .attr('transform', 'translate(' + p.x + ',' + p.y + ')')
          .attr('r', '5')
          .attr('class', 'dot')
          .style('cursor', 'pointer')
          .call(drag)

        var dots = d3.selectAll(".dot")

        var svg = d3.select('body').append('svg')
          .attr('width', 400)
          .attr('height', 400)
          .on('click', click)

        var drag = d3.behavior.drag()
          .on('drag', dragmove)

        function dragmove(d) {
          var x = d3.event.x
          var y = d3.event.y
          d3.select(this).attr('transform', 'translate(' + x + ',' + y + ')')
          this.x = x
          console.log('x:', this.x)
      }

    console.log('x:', this.x)
    }
  },

  ready: function () {
  }
})

现在,我正在尝试获取拖动圆圈的位置 x。第一个console.log('x:', this.x) 记录位置:x: 190。但是第二长,dragmove() 函数之外的那个不记录任何内容。

如何让第二个console.log 记录this.x 的值?

这是 JSFiddle:https://jsfiddle.net/alexcheninfo/unejge3k/1

【问题讨论】:

  • 你想要圆圈翻译还是只是(任何)变量x?
  • @Fawzan 圆圈的位置:x 和 y。但现在我只是想得到x,进行测试。
  • 你确定this在每种情况下都指的是同一个对象吗?
  • 你可以得到翻译 x ,如果你想要 x 你需要在上下文之外定义它。我会回答的。
  • @nnnnnn 哦,你是对的。 this.x 在 dragmove 内返回 undefined。不是在data 中创建的x。如何解决这个问题?

标签: javascript d3.js vue.js


【解决方案1】:

如果您想在dragmove 函数之外访问x,您必须在外部范围内定义x。

var x, y;

function dragmove(d) {
          x = d3.event.x
          y = d3.event.y
          d3.select(this).attr('transform', 'translate(' + x + ',' + y + ')')
          this.x = x
          console.log('x:', this.x)
      }
console.log('x:', this.x)

但我真的不推荐这种方法。

既然要圆的翻译,就可以这样。

var c = svg.append('circle')
          .attr('transform', 'translate(' + p.x + ',' + p.y + ')')
          .attr('r', '5')
          .attr('class', 'dot')
          .style('cursor', 'pointer')
          .call(drag)
var trans = d3.transform(c.attr('transform')).transalte;

var tx = trans[0];
var ty = trans[1];

希望这会对你有所帮助。

【讨论】:

  • 感谢您的回答。我试过你的代码,但我得到:Uncaught TypeError: Cannot read property '0' of undefined。也许我把代码放在了错误的地方? jsfiddle.net/alexcheninfo/unejge3k/2
  • 是的,放错地方了。检查这个sn-p。 jsfiddle.net/unejge3k/3
  • 哦,我明白了。但是现在没有办法附加圆圈了。
  • 如果你能说出确切的要求,也许我可以帮忙
  • 谢谢。我希望能够添加圆圈并将它们拖动(我原来的小提琴的行为),然后获得我正在拖动的圆圈的x 和y 的位置并将它们存储在this.x 和@ 987654332@(最后两个在data : { }中定义。
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2018-07-14
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多