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")
이 주석 처리 된 경우에만 작동합니다. 왜 ? 이전 바인딩보다 새로운 바인딩에 더 적은 데이터가 있다면 어떻게 될까요?
미리 감사드립니다. 필요에 따라
감사합니다. 그러나 두 데이터 세트의 길이가 같더라도 .enter(). append ("text")는 처음에했던대로 작동하고 텍스트를 덮어 쓰지 않아야합니까? (사실이 아닙니다!) 두 번째 함수에서 svg.selectAll ("text"). exit(). remove()를 추가했습니다. [여기] (http://codepen.io/anon/pen/MJKRER? 편집자 = 1010) 작은 데이터 세트와 함께 오래된 요소를 제거하지 않습니다 ... – Guillaume
@Guillaume'enter()'라고 쓰면 순간적으로 크기가 ** 제로 **입니다. 데이터 배열은 동일합니다. 따라서, .enter(). append ("text")'는 절대로 작동하지 않을 것이다. –
@GerardoFurtado 귀하의 의견을 보내 주셔서 감사합니다. 조금 더 명확합니다. 즉, enter()는 새로운 요소에만 해당됩니다. 그래서, data1.length = 5라고 말하자면, 업데이트 할 4 개의 텍스트와 1을 만드는 것입니다. 어떻게하면 될까요? 만약 내가 enter()를 쓰면 다섯 번째 엘리먼트를 생성하지만 네 개의 다른 엘리먼트는 업그레이드하지 않습니다. 반대로 input()을 쓰지 않으면 네 개의 텍스트를 업데이트하지만 다섯 번째는 생성하지 않습니다 ... exemple [here] ] (http://jsbin.com/herikojeke/edit?html,js,output) – Guillaume