2013-11-20 46 views
2

我有一個有點嵌套的JSON文件:簡單的功能不工作中的if語句

{ 
    "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'上下文中的事件處理程序。因此,'mouseover'處理程序中的'd'將成爲與該節點相關的'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後的功能是使用(d)調用在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. 
     } 
    }) 
    ... 
    ;