【问题标题】:Cannot read property 'drag' of undefined D3无法读取未定义 D3 的属性“拖动”
【发布时间】:2017-04-13 09:37:20
【问题描述】:

我是 D3 的初学者,我试图用鼠标拖动一个矩形,但实际上我遇到了一些麻烦。

如果我在调用它之前定义 var drag 会得到这个错误:Cannot read property 'drag' of undefined

如果我在调用它之后定义 var drag,我会得到一个不同的错误:Cannot read property 'apply' of undefined 但实际上,在 stackoverflow 上搜索我读到要解决这个问题,我需要在调用它之前定义 var drag 并且我处于循环中。

您可以在下面看到我的代码。提前致谢。

$(document).ready(function() {
var width = 500;
var height = 500;
var fullAngle = 2 * Math.PI;
var arc2 = d3.arc()
            .innerRadius(195)
            .outerRadius(200)
            .startAngle(0.18)
            .endAngle(fullAngle / 1.02);

var svgContainer = d3.select("#container")
    .append("svg")
    .attr("width", width)
    .attr("height", height)
    .style("border", "1px solid");

var group1 = svgContainer.append("g");
var group2 = svgContainer.append("g");
group2.append("path")
    .attr("d", arc2())
    .attr("fill", "blue")

group1.attr("transform", "translate(" + 200 + "," + 200 + ")");
group2.attr("transform", "translate(" + 250 + "," + 250 + ")");

var rectangle = svgContainer.append("rect")
          .attr("x", 150)
          .attr("y", 50)
          .attr("width", 30)
          .attr('class', 'rectangle')
          .attr("height", 70)
          .call(drag)

    var drag = d3.behavior.drag().on('drag', function () {
        var obj = svgContainer.append("rect")
        dragMove(this, obj, 'rect')
    });
});



    function setPoints(obj, prop) {
        obj[prop] = []
        var k = 0
        d3.selectAll('.rect')
            .each(function() {
                var c = d3.select(this)
                var cX = d3.transform(c.attr('transform')).translate[0]
                var cY = d3.transform(c.attr('transform')).translate[1]
                obj[prop].push({
                    x: cX,
                    y: cY,
                    index: k++
                })
            })
    }

      function dragMove(rectangle, obj, prop) {
          var x = d3.event.x
          var y = d3.event.y
          setPoints(obj, prop)
          d3.select(rectangle).attr('transform', 'translate(' + x + ',' + y + ')')
          $scope.$apply()
      }

【问题讨论】:

    标签: javascript jquery d3.js drag-and-drop


    【解决方案1】:

    您在代码中使用 d3 v4。

    d3.behavior.drag() 改为d3.drag 你的函数应该是这样并在使用前声明

    var drag = d3.drag().on("drag", function () {
             d3.event.sourceEvent.stopPropagation(); // silence other listeners
              dragMove(this, obj, 'points')
         })
    

    实现您的 dragMove 函数以继续查看此FIDDLE

    【讨论】:

    • 我重新排列了我的代码,现在可以拖动了。我在我的 sn-p 中添加了我调用来拖动矩形的函数(setPoints 和 dragMove),但实际上当我单击矩形时,它会不正确地向右移动
    • @PierpaoloErcoli yopur 的预期输出或您想要做什么可能是该定义可以提供帮助
    • @PierpaoloErcoli 如果你只是想跟随拖动路径,这里是jsfiddle.net/n4m1r8nb/208
    • 既没有小提琴也没有想法没有任何效果.. 虽然有 v3 到 v4 的变化
    • @ThinkTank 你看到jsfiddle.net/n4m1r8nb/208 拖动在这里工作
    【解决方案2】:

    您使用的是 D3 v4,并且与许多其他东西一样,拖动行为已被重命名。来自changelog

    拖动行为 d3.behavior.drag 已重命名为 d3.drag。

    您需要针对此重命名调整您的代码。

    var drag = d3.drag().on('drag', function () {
        dragMove(this, obj, 'points')
    });
    

    由于实施也发生了变化,因此可能需要进行其他更改才能使其真正发挥作用。但是,从您提供的代码中并不清楚这一点,值得提出另一个问题。

    【讨论】:

    • 我重新排列了我的代码,现在可以拖动了。我在我的 sn-p 中添加了我调用来拖动矩形的函数(setPoints 和 dragMove),但实际上当我单击矩形时,它会不正确地向右移动
    • @PierpaoloErcoli 请重新阅读我回答的最后一段:这是意料之中的。但正如我所说,这应该作为一个新问题发布。
    猜你喜欢
    • 2016-06-30
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2016-03-10
    • 2016-03-25
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多