2017-01-11 1 views
1

d3.js의 데이터 바인딩에 대해 명확하게 이해하지 못하는 사항이 있습니다.d3.js 데이터 바인딩 업데이트

나는 4 개 개의 숫자가 표시되는 간단한 예제 (즉 here을 찾을 수 있습니다) 설정 한 :

function draw1(){ 
svg.selectAll("text").data(data1) 
     //.enter().append("text") /* if not commented does nothing*/ 
     .text(function(d){return d;}) 
     .attr("x",function(d,i){return position[i][0]+30;}) 
     .attr("y",function(d,i){return position[i][1]+30;}); 
} 
:

var data0 = [1, 2, 3, 4]; 
var data1 = [5, 6, 7,8]; 
var data2 = [10, 11,12]; 

var lgth = 100; 
var wdth = 50; 
var position = [[0,0],[0,wdth], [lgth,0],[lgth,wdth]]; 

var svg = d3.select("#test").append("svg") 
      .attr("width", wdth+100) 
      .attr("height", lgth+100); 

svg.selectAll("text").data(data0) 
     .enter().append("text") 
     .text(function(d){return d;}) 
     .attr("x",function(d,i){return position[i][0]+30;}) 
     .attr("y",function(d,i){return position[i][1]+30;}); 

그러나 내가 그 기능을 사용하여 이러한 4 개 개의 숫자를 업데이트 할 때를

.enter().append("text")이 주석 처리 된 경우에만 작동합니다. 왜 ? 이전 바인딩보다 새로운 바인딩에 더 적은 데이터가 있다면 어떻게 될까요?

미리 감사드립니다. 필요에 따라

답변

1
svg.selectAll("text").data(data0) 
    .enter().append("text") 
    .text(function(d){return d;}) 
    .attr("x",function(d,i){return position[i][0]+30;}) 
    .attr("y",function(d,i){return position[i][1]+30;}); 

.enter(). 추가 ("텍스트") 새로운 요소를 생성합니다. 여기이 경우에 두 배열 데이터 0데이터 1의 요소 수가 같으므로 새 텍스트 요소가 필요하지 않습니다. d3은 값을 업데이트합니다. 따라서 .enter()의 필요가. 당신이 적은 데이터가있는 경우 (오래된 요소를 제거 할 종료에 대한 draw1()에 다음 줄을 추가해야

svg.selectAll("text").data(data1) 
    .text(function(d){return d;}) 
    .attr("x",function(d,i){return position[i][0]+30;}) 
    .attr("y",function(d,i){return position[i][1]+30;}); 

("텍스트")를 추가하지 새로운

svg.selectAll("text").exit().remove() 

) 바인딩 난 당신이 더 명확 과정을 이해하기위한 다음의 예를 참조하는 것이 좋습니다 : 귀하의 코멘트에 대한 https://bl.ocks.org/mbostock/3808218

+0

감사합니다. 그러나 두 데이터 세트의 길이가 같더라도 .enter(). append ("text")는 처음에했던대로 작동하고 텍스트를 덮어 쓰지 않아야합니까? (사실이 아닙니다!) 두 번째 함수에서 svg.selectAll ("text"). exit(). remove()를 추가했습니다. [여기] (http://codepen.io/anon/pen/MJKRER? 편집자 = 1010) 작은 데이터 세트와 함께 오래된 요소를 제거하지 않습니다 ... – Guillaume

+0

@Guillaume'enter()'라고 쓰면 순간적으로 크기가 ** 제로 **입니다. 데이터 배열은 동일합니다. 따라서, .enter(). append ("text")'는 절대로 작동하지 않을 것이다. –

+0

@GerardoFurtado 귀하의 의견을 보내 주셔서 감사합니다. 조금 더 명확합니다. 즉, enter()는 새로운 요소에만 해당됩니다. 그래서, data1.length = 5라고 말하자면, 업데이트 할 4 개의 텍스트와 1을 만드는 것입니다. 어떻게하면 될까요? 만약 내가 enter()를 쓰면 다섯 번째 엘리먼트를 생성하지만 네 개의 다른 엘리먼트는 업그레이드하지 않습니다. 반대로 input()을 쓰지 않으면 네 개의 텍스트를 업데이트하지만 다섯 번째는 생성하지 않습니다 ... exemple [here] ] (http://jsbin.com/herikojeke/edit?html,js,output) – Guillaume