У меня есть карта топологии с функциями панорамирования и масштабирования.
Нажимая на страну, я масштабирую / панорамирую страну, используя это:
if (this.active === d) return
var g = this.vis.select('g')
g.selectAll(".active").classed("active", false)
d3.select(path).classed('active', active = d)
var b = this.path.bounds(d);
g.transition().duration(750).attr("transform","translate(" +
this.proj.translate() + ")" +
"scale(" + .95 / Math.max((b[1][0] - b[0][0]) / this.options.width, (b[1][1] - b[0][1]) / this.options.height) + ")" +
"translate(" + -(b[1][0] + b[0][0]) / 2 + "," + -(b[1][1] + b[0][1]) / 2 + ")");
g.selectAll('path')
.style("stroke-width", 1 / this.zoom.scale())
Однако, если я продолжу перетаскивать панорамирование, карта вернется в исходное положение до того, как произойдет щелчок, перед панорамированием. Код для панорамирования / масштабирования находится здесь:
this.zoom = d3.behavior.zoom().on('zoom', redraw)
function redraw() {
console.log('redraw')
_this.vis.select('g').attr("transform","translate(" +
d3.event.translate.join(",") + ")scale(" + d3.event.scale + ")")
_this.vis.select('g').selectAll('path')
.style("stroke-width", 1 / _this.zoom.scale())
}
this.vis.call(this.zoom)
Другими словами, после увеличения точки путем щелчка и последующего перетаскивания с помощью функции перерисовки, перерисовка не выбирает правильный перевод + масштаб для продолжения.
d3.select(path).classed('active', active = d)
устанавливает классactive
для всего вpath
. Вероятно, это не вызывает проблемы (если у вас нет кода, чтобы сосредоточиться наactive
путях в другом месте), но я думаю, вы имели в виду==
там. - person musically_ut   schedule 19.12.2013