2016-07-15 50 views
0

使用D3.js,我試圖將我的enter方法抽象爲一個函數,該函數確定這是否是我們第一次需要輸入。有人能指出爲什麼這不起作用嗎?D3 abstract enter()方法

var firstRender = 0; 

    svg.append("g") 
    .attr("id", "circles") 
    .selectAll("circle") 
    .data(data) 
    .call(enterStage) //continue chaining other D3 methods after this is ran 
    .append("circle") 
    .attr("cx", function(d) { 
     return xScale(d[0]); 
    }) 
    .attr("cy", function(d) { 
     return yScale(d[1]); 
    }) 
    .attr("r", 2); 


    function enterStage() { 
    if (firstRender < 1) { 
     firstRender++; 
     return this.enter(); 
    } else { 
     return this; 
    } 
    } 
+0

你想以這種方式實現這個目標? – altocumulus

回答

1

你並不需要一個包裝,你可以簡單地對所有的選擇進行操作:

var sel = svg.selectAll("g.circles").data([1]); // dummy data for top-level element 
sel.enter().append("g") 
    .attr("id", "circles"); 

var circleSel = sel.selectAll("circle").data(data); 
circleSel.enter().append("circle"); 
circleSel.attr("cx", function(d) { 
    return xScale(d[0]); 
    }) 
    .attr("cy", function(d) { 
    return yScale(d[1]); 
    }) 
    .attr("r", 2); 

這將正常工作,甚至在第一時間爲進入選擇合併到更新的選擇,當你追加元素。

+0

雖然要小心v4。這不會按預期工作,因爲v4不再將輸入選擇的附加項和插入項合併到更新選項中。你將不得不使用['selection.merge()'](https://github.com/d3/d3-selection/blob/master/README.md#selection_merge)來達到同樣的效果。我在[answer](https://github.com/d3/d3-selection/blob/master/README.md#selection_merge)中發佈了一個解釋給另一個問題。 – altocumulus