2016-02-26 31 views
0

我正在使用d3散點圖。我連接到我的數據庫,最開始我會在圖表上說出3個點。每個點代表一張紙,x軸是年份,y軸是它的引用次數。現在,當我點擊一個點時,該文件引用的論文就會出現在圖表上。到目前爲止,我已經完成了上述所有工作,但現在我的問題是,儘管當我點擊相關論文時,圖表上出現了相關論文,但當點擊這些點時,沒有任何反應。所以我沒有設法將我的Json數據綁定到新的點上。下面是相關代碼:將數據綁定到d3中的新元素

// initial connection to display papers 
d3.json("connection4.php", function(error,dataJson) { 

dataJson.forEach(function(d) { 

    d.YEAR = +d.YEAR; 
    d.counter = +d.counter; 
    console.log(d); 
    }) 

//baseData is the original data that I dont want to be replaced 
baseData = dataJson; 

// draw dots 
    var g = svg.selectAll(".dot") 
     .data(baseData) 
     .enter() 
     .append("circle") 
     .attr("class", "dot") 
     .attr("r", 3.5) 
     .attr("cx", function(d) {return x(YearFn(d))}) 
     .attr("cy", function(d) {return y(Num_citationsFn(d))}) 
     .style("fill","blue") 

.on("click", function(d, i) { 

     d3.json("connection2.php?paperID="+d.ID, function(error, dataJson) { 

      console.log(dataJson); 

      dataJson.forEach(function(d) { 
       d.YEAR = +d.YEAR; 
       d.counter = +d.counter; 
       console.log(d); 


       baseData.push(d); 
       }) 

       var g = svg.selectAll(".dot") 
        .data(baseData) 
        .enter() 
        .append("circle") 
        .attr("class", "dot") 
        .attr("r", 3.5) 
        .attr("cx", function(d) {return x(YearFn(d))}) 
        .attr("cy", function(d) {return y(Num_citationsFn(d))}) 
        .style("fill", "red") 

        })  

我在PHP文件查詢是罰款,我可以看到他們正在返回正確的數據,所以我想我的主要問題是從我的第二個連接到新的綁定我的JSON數據點。我不知道有誰能夠闡明我需要如何去解決這個問題。我是新來的d3,所以任何反饋意見是讚賞!在此先感謝

+0

作爲一般對您的代碼發表評論,您應該嘗試將代碼位分解爲函數而不是複製粘貼。獲取數據對象並更新節點列表的函數可能首先會避免該問題。我也在考慮格式化線('d.YEAR = + d.YEAR;')。 – tarulen

+0

@laurent謝謝我非常感謝您的反饋,我非常喜歡初學者,所以這就是爲什麼我的代碼不能很好地形成,但會嘗試和利用更多的功能,因爲它可能會讓我的生活變得更輕鬆! –

回答

1

我認爲問題很簡單,你不會將"click"事件綁定到您新創建的節點。

通過

function clickHandler (d,i){ 
    ... 
} 

// draw dots 
var g = svg.selectAll(".dot") 
    .data(baseData) 
    .enter() 
    .append("circle") 
    .attr("class", "dot") 
    .attr("r", 3.5) 
    .attr("cx", function(d) {return x(YearFn(d))}) 
    .attr("cy", function(d) {return y(Num_citationsFn(d))}) 
    .style("fill","blue") 
    .on("click", clickHandler); //clickHandler is referenced here, instead of the original anonymous function 

更換線

// draw dots 
var g = svg.selectAll(".dot") 
    .data(baseData) 
    .enter() 
    .append("circle") 
    .attr("class", "dot") 
    .attr("r", 3.5) 
    .attr("cx", function(d) {return x(YearFn(d))}) 
    .attr("cy", function(d) {return y(Num_citationsFn(d))}) 
    .style("fill","blue") 
    .on("click", function(d, i) { 
    ... 
    }) 

,並添加一個.on("click", clickHandler);調用到新創建的節點,對clickHandler函數內部,即:

  ///add linked dots 
      var g = svg.selectAll(".dot") 
       .data(baseData) 
       .enter() 
       .append("circle") 
       .attr("class", "dot") 
       .attr("r", 3.5) 
       .attr("cx", function(d) {return x(YearFn(d))}) 
       .attr("cy", function(d) {return y(Num_citationsFn(d))}) 
       .style("fill", "red") 
       .on("click", clickHandler); //click handler is *also* called here 
+0

這對我很有意義。但是當我在'clickHandler函數的關閉}括號後面加上'.on(「click」,clickHandler)時,我得到錯誤'Uncaught ReferenceError:clickHandler is not defined'? @laurent –

+0

好的,這可能是因爲我使用了匿名函數,這些人不喜歡遞歸。現在已經糾正了。 – tarulen

+0

可能是一個長鏡頭,但認爲Id機會它,你幫助我的一切是現在的作品,現在我只是試圖使用相同的方法來創建一個右鍵單擊處理程序。問題似乎是我的Json數據沒有被綁定到新節點。但是現在得到的錯誤是:'Uncaught TypeError:無法讀取屬性'forEach'的未定義'和未定義的是dataJson ..它爲以前的點擊事件工作正常..我已經嘗試重新命名要傳遞的數據但沒有運氣.. dataJson是先前定義的,所以我不確定問題出在哪裏!對不起再次提起這件事! @laurent –

相關問題