Я действительно видел оба ярлыка, когда попробовал это.Но есть пара вещей, которые можно исправить здесь.Ключевым моментом является то, что когда вы объединяете такие методы в цепочку, когда вы add()
устанавливаете новую метку, вы меняете контекст следующих вызовов методов, например:
vis.add(pv.Bar)
// this applies to the Bar
.width(10)
.add(pv.Label)
// this applies to the label
.top(5);
Есть несколько проблем сэто в вашем коде:
Ваши обработчики event()
прикреплены к метке, а не к панели - к сожалению, метки не могут получать события в Protovis.
Ваша вторая метка прикреплена к первой метке.Хотя кажется, что на самом деле это работает, лучше избегать этого - вы действительно хотите, чтобы он был прикреплен к панели.
Самый простой способ справиться с этим - объединить методы в одномотметка.Вы можете сделать это, назначив родительскую метку переменной, а затем несколько раз используя эту переменную для разных дочерних меток.Кроме того, сначала вы прикрепляете первую метку непосредственно к панели, а не к якору - ее прикрепление к якору обычно дает более предсказуемые результаты.
Обновленный код:
// make a new variable to refer to the bars
var bars = vis.add(pv.Bar)
.data(wData)
.bottom(0)
.width(20)
.height(function(d) d[1] * 1.2)
.left(function() this.index * 27)
.fillStyle(function() vis.j() == this.index ? "orange" : "steelblue")
// you need to move the events up to apply
// to the bar - labels can't receive events,
// and the index will always be 0
.event("mouseover", function() vis.j(this.index))
.event("mouseout", function() vis.j(-1));
// now add each label to the bars
bars.anchor('bottom').add(pv.Label)
.bottom(0)
.textAlign("center")
.textStyle("white")
.text(function(d) d[0] );
// and again
bars.anchor("top").add(pv.Label)
.visible(function() vis.j() >= 0)
.textStyle("white")
.text(function(d) d[1]);
Естьрабочая версия здесь: http://jsfiddle.net/nrabinowitz/ABmuq/