【问题标题】:Unable to Zoom d3 techanjs无法缩放 d3 techanjs
【发布时间】:2017-12-10 18:51:16
【问题描述】:

我使用的代码与http://techanjs.org/ 中使用的代码几乎相同。我试图在图表中添加缩放功能,因为开发人员已在here 中呈现图表。但不知何故,我无法放大它。我收到错误选择未在控制台中定义。我正在使用以下代码来呈现图表。 https://paste.fedoraproject.org/paste/7gJq9wKL4h4s862EDuxnQQ。我确定我在这里做错了,如果我能得到任何帮助,我将不胜感激,因为我仍在学习 D3。

【问题讨论】:

  • 如果没有一个最小的、完整的和可验证的例子,真的很难说 - stackoverflow.com/help/mcve - 例如是什么引发了错误,哪个调用?没有更多信息,很难提供帮助。
  • 真的很难最小化它,因为我真的想要其他功能以及缩放,并且不确定我是否尝试缩小它会产生相同的错误。
  • 那么,一旦赏金清除,就关闭投票 - 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及最短的在问题本身中重现它所必需的代码。简单的错误是因为您试图在未定义的函数中使用“选择”。

标签: javascript d3.js techan.js


【解决方案1】:

我猜问题是你引用了变量selection,但它没有被定义。

因此 -

选择未定义

selection 是传递给bigchart 函数的参数。

但是您随后在未定义的resetzoomed 函数中使用它。

//Zoom Begins
 function reset() {
        zoom.scale(1);
        zoom.translate([0,0]);
        selection.call(draw); // this will throw an error
    }

    function zoomed() {
        x.zoomable().domain(d3.event.transform.rescaleX(zoomableInit).domain());
        y.domain(d3.event.transform.rescaleY(yInit).domain());
        yPercent.domain(d3.event.transform.rescaleY(yPercentInit).domain());

        selection.call(draw); // this will throw an error
    }
//Zoom Ends

要修复,要么将选择作为参数传递给函数(与其他函数一样) - 要么将 selection 设为 BigChart 的属性,以便 reset 和 @987654331 可以引用它@函数。

 // pass selection to the functions as a parameter

 function reset(selection) {
    zoom.scale(1);
    zoom.translate([0,0]);
    selection.call(draw);
 }

 function zoomed(selection) {
    x.zoomable().domain(d3.event.transform.rescaleX(zoomableInit).domain());
    y.domain(d3.event.transform.rescaleY(yInit).domain());
    yPercent.domain(d3.event.transform.rescaleY(yPercentInit).domain());
    selection.call(draw);
 }

那么当你调用函数时,显然你传入了正确的对象......例如

zoom = selection.call(d3.zoom().on("zoom", zoomed));

而不是

zoom = d3.zoom().on("zoom", zoomed),

【讨论】:

  • 我刚刚尝试了代码,如果我使用 zoom = selection.call(d3.zoom().on("zoom", zoomed));我得到的选择没有在那条线上定义,并且图表没有呈现。但是,如果我使用 zoom = d3.zoom().on("zoom", zoomed),图表渲染良好,但在尝试缩放时出现错误。有什么建议吗?
  • 是的,发布一个最小、完整和可验证的示例 - stackoverflow.com/help/mcve - 示例 zoom = selection.call(d3.zoom().on("zoom", zoomed) );是为了展示你如何通过选择 - 这不是你复制和粘贴的。显然,“选择”在您使用之前是未定义的——这是您问题的根源!
  • 我在bl.ocks.org/andredumas/edf630690c10b89be390 中找到了另一组代码,是否可以根据浏览器宽度调整其大小?因为在这里缩放效果很好。
猜你喜欢
  • 2014-03-06
  • 2021-04-07
  • 2020-10-20
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2015-06-21
  • 2015-01-18
  • 1970-01-01
相关资源
最近更新 更多