Reputation: 177
I found this example for a Pie Chart and I was hoping to modify it (easily) to update when a list item text() was updated within, sadly I have greatly misunderstood the mechanics at work and would like some help figuring out why it isn't behaving how I would like.
Here is a plnk + code;
HTML:
<li><a href="#" id="data">Apples</a>
<ul id="dataset">
<li>
<a href="#" name="d" value="apples">Apples</a>
</li>
<li>
<a href="#" name="d" value="oranges">Oranges</a>
</li>
</ul>
</li>
</ul>
Javascript:
var width = 960,
height = 500,
radius = Math.min(width, height) / 2;
var color = d3.scale.category20();
var pie = d3.layout.pie()
.value(function(d) {
return d.apples;
})
.sort(null);
var arc = d3.svg.arc()
.innerRadius(radius - 100)
.outerRadius(radius - 20);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
d3.tsv("data.tsv", type, function(error, data) {
$("a").on('click', function() {
$("#data").html($(this).text())
}).on('click', function() {
if ($("#data").text() == "Oranges") {
change()
}
})
if (error) throw error;
console.log(data)
var path = svg.datum(data).selectAll("path")
.data(pie)
.enter().append("path")
.attr("fill", function(d, i) {
return color(i);
})
.attr("d", arc)
.each(function(d) {
this._current = d;
}); // store the initial angles
function change() {
var value = this.value;
console.log(value)
pie.value(function(d) {
return d[value];
}); // change the value function
path = path.data(pie); // compute the new angles
path.transition().duration(750).attrTween("d", arcTween); // redraw the arcs
}
});
function type(d) {
d.apples = +d.apples;
d.oranges = +d.oranges;
return d;
}
// Store the displayed angles in _current.
// Then, interpolate from _current to the new angles.
// During the transition, _current is updated in-place by d3.interpolate.
function arcTween(a) {
var i = d3.interpolate(this._current, a);
this._current = i(0);
return function(t) {
return arc(i(t));
};
}
I think the issue could be I'm not referencing the value correctly?
Any advice is much appreciated,
Cheers
Upvotes: 1
Views: 1032
Reputation: 10612
You're onclick function should be something like this :
$("a").on('click', function() {
console.dir(this.innerHTML)
$("#data").html(this.innerHTML)
change(this.innerHTML.toLowerCase())
})
This gets the innerHTML ie the text value of the link pressed and passes it to the change function (which i have added). Also, put to lower case as it checks if the string is oranges not Oranges.
Updated plnkr : http://plnkr.co/edit/d7qJjBaihVALSdkzPtYi?p=preview
A bit more explanation.
You were trying to get the value
of a text element whereas the example youre following was getting it from a check box. You can't get value from text you need to get innerHTML or textContent etc
Upvotes: 2