为什么我的变量的变化在此函数之外不可见?

时间:2016-01-19 02:43:54

标签: javascript d3.js vue.js

以下代码是在VueJS实例中的D3剪切放置。该代码段会创建圆圈并允许您拖动它们。

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

1 个答案:

答案 0 :(得分:1)

如果您想访问x功能之外的dragmove,则必须在外部范围内定义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];

希望这会对你有所帮助。