2014-01-03 9 views
2

В d3js tree sample я попытался перевести вызов для обновления вне функции d3.json. Когда я сделал это, я получаю:TypeError с деревом d3js

TypeError: d is undefined

Вот код (функция здесь немного отличается от ссылки на пример). Обратите внимание, что я переместил вызов для обновления вне функции d3.json. Обратите внимание, что root - это глобальная переменная.

d3.json("../data/flare.json", function(json) { 
    root = json; 
    root.x0 = height/2; 
    root.y0 = 0; 

    function collapse(d) { 
     if (d.children) { 
     d._children = d.children; 
     d._children.forEach(collapse); 
     d.children = null; 
     } 
    } 

    root.children.forEach(collapse); 
    // move this out 
    // update(root); 
}); 

update(root); 

function update(source) {..... 

ответ

3

d3.json - это асинхронный вызов. Это означает, что вызов будет немедленно возвращен, но код в обработчике не будет работать до конца. В вашем случае это означает, что root не определен (или пуст), когда вы звоните update(root).

Одним словом, у вас есть, чтобы позвонить update(root) изнутри обратного вызова d3.json. Хотя есть несколько возможностей заставить его работать за пределами обратного вызова, они гораздо более сложны и сложны.

+0

Lars Kotthoff вы можете поделиться другими способами, чтобы вызов функции работал вне callaback. Я вижу, что это работает, когда я вызываю его из элемента html, то есть в ответ на событие. Я не уверен, могу ли я создать событие из javascript – nilanjan

+1

[Этот вопрос] (http://stackoverflow.com/questions/2490825/how-to-trigger-event-in-javascript) объясняет, как это сделать. –

0

Мы не можем использовать переменный корень к внешнему function, потому что корень является локальным переменным для этого function.If вы хотите использовать снаружи, вы будете делать корень как global varible для сохранения этого JSON;

var root; 
    d3.json("../data/flare.json", function(json) { 
    root = json; 
    root.x0 = height/2; 
    root.y0 = 0; 

    function collapse(d) { 
     if (d.children) { 
     d._children = d.children; 
     d._children.forEach(collapse); 
     d.children = null; 
     } 
    } 

    root.children.forEach(collapse); 
    // move this out 
    // update(root); 
}); 



function update(source) {..... 
+0

Я бы сказал, что «root» - это глобальная переменная – nilanjan

+0

, вы можете объявить root как глобальную переменную, но одна проблема может возникнуть с указанным выше кодом, поскольку функция d3.json() по умолчанию асинхронна. – Manoj

+0

Спасибо. Я вижу это здесь: http://stackoverflow.com/questions/17294363/variable-scope-in-d3-javascript – nilanjan

Смежные вопросы