Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to rebind data in d3.js

I am using d3.js library to generate contents based on data.

Here is a simplified example.

data_arr = [0,1,2,3,4];
d3.select("#mylist").selectAll('li').data(data_arr).enter().append("li").html(
    function(d)
    {
        var element = document.createElement('div');
        element.innerHTML = '<div id="innerDiv">' + d + '</div>';
        return element.innerHTML;
   });

If I change my array, for example the new data is [5,3]. How is the best way to rebind and show the new html? Do I have to call the same sentence again or is it a better way?

Consider the case of a more complex data structure. i.e.

data_arr = [obj1, obj2, obj3, obj4]; 

and

element.innerHTML = '<div id="innerDiv">' + d.field + '</div>';

What happens if I do obj1.field = 'newValue'. How is the rebind done?

Thanks!

like image 534
Tony Avatar asked May 22 '12 21:05

Tony


People also ask

What does .data do in D3?

data() returns the values from the array it's been passed, we can use these values to change attributes and styles for SVG elements with a method chain. NOTE: It's possible to use . data() for changing other elements, but we'll focus on SVG. D3 can change the radius by using values from from an array radiusData.

What is append in D3?

append() function is used to append a new element to the HTML tag name as given in the parameters to the end of the element. If the type that is given is a function then it must be evaluated for each element that is in the selection. Syntax: selection.

What is D3 select this?

d3.select(this) creates a 1-element selection containing the current. node. This allows you to use D3's operators to modify the element, or.


1 Answers

Use a function. For example, here's a function that will populate a list from an array of strings:

function list(ul, data) {
  var li = ul.selectAll("li").data(data);
  li.exit().remove();
  li.enter().append("li");
  li.text(function(d) { return d; });
}

Now if you want to initialize your list, you can say:

d3.select("#list").call(list, [0, 1, 2, 3, 4]);

Then later if you want to update, you can say:

d3.select("#list").call(list, [5, 3]);

If you prefer (and you don't need method chaining), you can write this without selection.call:

list(d3.select("#list"), [5, 3]);
like image 143
mbostock Avatar answered Oct 03 '22 00:10

mbostock