代码之家  ›  专栏  ›  技术社区  ›  Kingamere

d3.jsv5.9.1-此版本中的某些方法无法按预期工作

  •  0
  • Kingamere  · 技术社区  · 5 年前

    我在Angular7.1.4项目中使用d3.js。我使用的d3版本是5.9.1,它是 latest version 到目前为止。

    as follows :

    npm install d3

    哪个放的 "d3": "^5.9.1" 在我的 package.json 文件。

    @types/d3 通过npm和命令 npm install @types/d3 ,然后把 "@types/d3": "^5.7.1" 在我的 包.json

    @类型/d3

    import * as d3 from "d3"; ,就像 d3 github guide says .

    现在,我来举个例子 this website 它使用d3创建一个条形图。

    找到了完整的源代码 here 如果你看看他们声明的 <script> tag,您将看到他们使用的是d3版本5.9.1,与我使用的版本相同:

    <script src="https://d3js.org/d3.v5.min.js"></script>

    // https://d3js.org v5.9.1 Copyright 2019 Mike Bostock

    但是,当我将以下代码复制到typescript文件中时:

      const yScale = d3.scaleLinear()
      .range([height, 0])
      .domain([0, 100]);
    
      const makeYLines = () => d3.axisLeft()
      .scale(yScale)
    

    d3.axisLeft() 方法调用,错误为:

    Expected 1 arguments, but got 0.

    但是,jsfiddle上的示例使用了与我相同的版本(5.9.1),没有遇到任何问题。

    有人能解释一下是什么问题吗?

    编辑:

    https://d3js.org/d3.v5.js 以及 axisLeft 方法实际上接受了一个参数:

    function axisLeft(scale) { return axis(left, scale); }

    那么jsfiddle示例如何在不传递参数的情况下调用方法呢?

    0 回复  |  直到 5 年前
        1
  •  5
  •   Mark    5 年前

    好吧,如果你看看 d3 源代码再远一点,它希望您传递的参数是 scale :

    function axis(orient, scale) {
      var tickArguments = [],
      ...
    

    如果你不通过它,体重秤将以同样的速度下降 未定义 .

    但是 axis 是一个闭包,它提供了另一种方法来提供 规模 用一个 .scale “方法”。

    axis.scale = function(_) {
      return arguments.length ? (scale = _, axis) : scale;
    };
    

    你的下一段代码就是通过使用这个“方法”来传递尺度。

    const makeYLines = () => d3.axisLeft(yScale);