2013-11-20 4 views
2

У меня есть несколько вложенных JSON файл:Простая функция не работает в случае, заявление

{ 
    "name": "1370", 
    "children": [ 
    { 
     "name": "Position X", 
     "value": -1 
    }, 
    {...} 
    ] 
    "matches": [ 
    { 
     "certainty": 100, 
     "match": { 
     "name": "1370", 
     "children": [ 
      { 
      "name": "Position X", 
       "value": -1 
      }, 
      {...} 
     ] 
     } 
    } 
    ] 
} 

Я хочу, чтобы отобразить его с помощью модифицированного Collapsible Tree. Я хочу отображать «совпадение» и «уверенность» при зависании соответствующего узла. Для этого я использовал simple tooltip example.

Теперь у меня есть что-то вроде этого:

var nodeEnter = node.enter().append("g") 
     ... 
     .on("mouseover", function(d) { 
      if (d.matches) { 
      return tooltip.style("visibility", "visible") 
       .text(function(d) { return d.name; }); 
      } 
     }) 
     ... 
     ; 

Я просто с помощью d.name для тестирования. Я хочу написать более сложную функцию позже. Но это не работает вообще. Я получаю всплывающую подсказку, но она пуста (или содержит значение по умолчанию). Точка, которую я не понимаю, что следующие работы:

if (d.matches) { 
    return tooltip.style("visibility", "visible") 
    .text(d.name); 
} 

Поэтому мне кажется, что функция не работает в данный момент. Что я делаю не так?

+0

слишком много вложенных логик. Мне непонятно, что возвращается к чему. Для отладки удалите условие 'if (d.matches)'. Это не имеет значения. Почему вы возвращаете 'd.name'? Разве вы не должны использовать его, как вы это делали во втором примере? '.text (d.name);' – m59

+2

Что вы ожидаете от параметра «d» в вашем обработчике «mouseover»? Это будет объект Event, независимо. – Pointy

+0

@Pointy Это обработчик событий в контексте 'd3'. Следовательно, 'd' в обработчике' mouseover' будет 'data', связанным с этим узлом. –

ответ

0

Ошибка, которую вы делаете, заключается в том, что при вызове метода jQuery .text() вы передаете функцию, но то, что вы хотите передать, является возвращаемым значением этой функции. Для того, чтобы сделать это, вам нужно просто вызвать функцию вы передаете в с аргументом он ожидает:

var nodeEnter = node.enter().append("g") 
    ... 
    .on("mouseover", function(d) { 
     if (d.matches) { 
     return tooltip.style("visibility", "visible") 
      .text(function(d) { return d.name; }(d)); 
     } 
    }) 
    ... 
    ; 

Обратите внимание, как функция вызывается с помощью (д) после того, как он объявлен

0

tooltip в linked example нет данных, связанных с этим. Следовательно, если вы попытаетесь использовать text function с аксессуаром, он не сможет получить никаких данных.

Я предполагаю, что вы не хотите брать данные из tooltip, но вместо того, чтобы работать с данными, принятых D3 к вашему mouseover событию:

var nodeEnter = node.enter().append("g") 
    ... 
    .on("mouseover", function(d) { // <-- This is the data passed by D3, associated to your node. 
     if (d.matches) { 
     var newName = computeNameFromData(d); 
     return tooltip.style("visibility", "visible") 
      .text(newName); // <-- Just pass a string here. 
     } 
    }) 
    ... 
    ; 
Смежные вопросы