Функція виклику d3 бібліотеки Javascript


81

Я не можу зрозуміти, як працює d3.call () і коли і де це використовувати. Ось посилання на підручник, яке я намагаюся заповнити.

Хтось може пояснити, що саме робить цей твір

var xAxis = d3.svg.axis()
              .scale(xScale)
              .orient("bottom");

svg.append("g").call(xAxis);

посилання ви надали пояснює , що call()робить
Ібу,

17
Так, але я все ще не можу отримати те, що svg.append ("g") .call (xAxis); робить :(
Andy897

Відповіді:


112

Я думаю, що фокус тут полягає в тому, щоб зрозуміти, що xAxis - це функція, яка генерує купу елементів SVG. Насправді це функція, яку повертає d3.svg.axis(). Функції масштабу та орієнтації - це лише частина синтаксису ланцюжків (докладніше про це читайте тут: http://alignedleft.com/tutorials/d3/chaining-methods/ ).

Таким чином, svg.append("g")додає елемент SVG-групи до svg і повертає посилання на себе у вигляді виділення (такий самий синтаксис ланцюга працює тут). Коли ви використовуєте callна виділенні, ви викликаєте функцію, названу xAxisна елементах виділенняg . В цьому випадку ви виконуєте функцію осі, xAxisна новостворені і заноситися групою g.

Якщо це все ще не має сенсу, наведений вище синтаксис еквівалентний:

xAxis(svg.append("g"));

або:

d3.svg.axis()
      .scale(xScale)
      .orient("bottom")(svg.append("g"));

як можна редагувати G-елементи svg.axis ()? У мене є етикетки, які кровоточать одна в одну, і я хочу застосувати до них трансформацію. Але я, здається, не можу отримати доступ до цих елементів
CQM

Перевірте відповідь тут stackoverflow.com/questions/12825630/ ... Після того, як ви вибрали текст або позначте елементи, ви зможете застосовувати перетворення, якщо хочете.
Superboggly

Чи є різниця в тому, щоб зробити один чи інший для виклику xAxis?
Мені подобається

4
Це добре пояснює .call()метод загалом. Це не пояснює наслідків виклику об’єкта осі, зокрема. І це не наближається до виправдання сюрреалістичної ситуації об’єкта осі, який поводиться як об’єкт, так і функція . Чому у світі це роблять? Гаразд, отже, у документації сказано, що якщо його викликати, то він візуалізує вісь . Це краще, ніж надати об'єкту осі метод .render ()? Хіба це не підтримало б набагато прямолінійнішеxAxis.scale(...).orient(...).render(...)
Боб Штейн

1
З документації у виклику вибору: "Єдина відмінність полягає в тому, що selection.call завжди повертає виділення, а не повертане значення викликаної функції, ім'я."
heltonbiker

5

Прийнятою відповіддю, яка залишила IMO, є те, що .call()це функція D3 API, яку не слід плутати з Function.prototype.call ()

selection.call(function[, arguments…])

Викликає вказану функцію рівно один раз, передаючи цей вибір разом з будь-якими необов’язковими аргументами. Повертає цей вибір. Це еквівалентно виклику функції вручну, але полегшує ланцюжок методів. Наприклад, щоб встановити кілька стилів у багаторазовій функції:

А тепер скажіть:

d3.selectAll("div").call(name, "John", "Snow");

Це приблизно еквівалентно:

name(d3.selectAll("div"), "John", "Snow");

Єдина відмінність полягає в тому, що selection.call завжди повертає виділення, а не повертане значення викликаної функції , ім’я.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.