Mam nieco zagnieżdżonego pliku JSON:

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

Chcę go wyświetlić za pomocą zmodyfikowanego Składane drzewo. Chcę wyświetlić "mecz" i "pewność" podczas unoszenia odpowiedniego węzła. Użyłem Prosty przykład Przykład dla tego.

Teraz mam coś takiego:

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

Po prostu używam D.Name do testowania. Chcę później pisać bardziej złożoną funkcję. Ale to w ogóle nie działa. Dostaję podpowiedź, ale jest pusty (lub zawiera wartość domyślną). Chodzi o to, że nie rozumiem, że następujące prace:

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

Dlatego wydaje mi się, że w tym momencie funkcja nie działa. Co ja robię źle?

2
haemka 20 listopad 2013, 21:25

2 odpowiedzi

Najlepsza odpowiedź

Błąd, który wykonujesz, jest to, że w połączeniu z metodą jQuery's .text (), przechodzisz w funkcji, ale co chcesz przejść, jest wartością powrotną tej funkcji. Aby to zrobić, wystarczy wywołać funkcję, w której przechodzisz z argumentem, jakiego oczekuje:

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) );
      }
   } )
  ...
  ;

Zauważ, jak funkcja jest wywoływana za pomocą (D) po ich zadeklarowaniu

0
Jay 20 listopad 2013, 17:31

tooltip w Linked Przykład nie ma z nim żadnych danych. Stąd, jeśli spróbujesz użyć text Funkcja z Accessor, nie może uzyskać żadnych danych.

Domyślam się, że nie chcesz podejmować danych z tooltip, ale zamiast tego pracować z danymi przekazywanymi przez D3 do zdarzenia 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.
      }
   } )
  ...
  ;
0
musically_ut 20 listopad 2013, 17:44