Используйте функцию с параметрами по умолчанию и дополнительными аргументами - PullRequest
0 голосов
/ 26 сентября 2018

Я изучаю D3 и ищу способ определить функцию с аргументами (d, i) и дополнительным аргументом «arg».Проблема в том, что позже мне нужно вызвать его, используя аргумент «arg», и он не работает ни по какой причине, здесь я приведу пример:

<!doctype html>
<meta charset="utf-8">
<title>my first d3</title>

<body>
  <script src="https://d3js.org/d3.v5.min.js"></script>
  <script>
    var data = [10, 20, 30, 40];

    var arg = 10;

    var lis = d3.select("body")
      .append("ul")
      .selectAll("li")
      .data(data)

    lis.enter()
      .append("li")
      .text(example(d, i, arg))

    function example(d, i, arg) {
      var c = i + arg;
      return "item n° " + c + " has value: " + d
    }
  </script>
</body>

Обратите внимание, что без "arg" и вызова его как "пример" это работает.Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Когда вы делаете это ...

.text(example(d, i, arg))

... вы немедленно вызываете example (с переменными, которые не существуют) и передаете его результат методу text(),что не то, что вы хотите.Как вы уже знаете ...

Обратите внимание, что без "arg" и вызова его как "example" это работает.

Это потому что ...

.text(example)

... совпадает с:

.text(function(d, i, n){
    return example(d, i, n);
})

... где d, i и n - аргументы по умолчанию, передаваемые анонимной функции.

Итак, если вы хотите использовать datum и index, переданные по умолчанию анонимной функции внутри метода text(), вы должны заключить вызов example внутри этой анонимной функции:

  .text(function(d, i) {
      return example(d, i, arg)
  })

Вот ваш код с этим изменением:

<!doctype html>
<meta charset="utf-8">
<title>my first d3</title>

<body>
  <script src="https://d3js.org/d3.v5.min.js"></script>
  <script>
    var data = [10, 20, 30, 40];

    var arg = 10;

    var lis = d3.select("body")
      .append("ul")
      .selectAll("li")
      .data(data)

    lis.enter()
      .append("li")
      .text(function(d, i) {
        return example(d, i, arg)
      })

    function example(d, i, arg) {
      var c = i + arg;
      return "item n° " + c + " has value: " + d
    }
  </script>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...