我想知道如何同时处理缩放和画笔行为。
想象一下,您有一个应用程序可以控制是否激活“选择区域”选项。如果激活,那么当用户开始视觉选择时,它应该刷一组SVG元素。如果停用,则用户将移动一些SVG容器(平移)。
如何在不相互覆盖和使用状态正常工作的情况下声明本机d3行为?或者,当用户想要一个不同的行为时,它是唯一能够销毁事件并声明新事件和反之亦然的解决方案吗?
或者,还有另一种不同的做法吗?
我有一段代码如下:
var zoomer, brush;
zoomer = self.get('zoomer');
if (zoomer === undefined){
self.set({zoomer: d3.behavior.zoom().translate([0,0]).scale(1)});
} else{
self.zoomCurrent();
}
brush = self.get('brush');
if (brush === undefined) {
self.set({brush: d3.svg.brush().x(d3.scale.identity().domain([0, self.get('config').width]))
.y(d3.scale.identity().domain([0, self.get('config').height]))});
}
svgObject = d3.select(self.get('target')).append('svg')
.attr('xmlns', 'http://www.w3.org/2000/svg')
.attr('xlink', 'http://www.w3.org/1999/xlink')
.attr('id', self.get('targetNoChar')+'SVG')
.attr('width',self.get('config').width)
.attr('height',self.get('config').height)
.attr("pointer-events", "all")
.call(self.get('zoomer').on("zoom", function (d) { self.zoomFunction(d3.event, this,d) }))
.append('g')
.attr('class', 'zoomer')
.attr("pointer-events", "all")
.append('g')
.attr("pointer-events", "all");
d3.select('svg').append('g')
.attr('class', 'brush')
.attr("pointer-events", "all")
.datum(function() { return { selected: false, previouslySelected: false};})
.call(self.get('brush').on('brushstart', function (d) { self.brushStart(d3.event, this,d) })
.on('brush', function (d) { self.brush(d3.event, this,d) })
.on('brushend', function (d) { self.brushEnd(d3.event, this,d) }));
我如何处理d3.behaviour.zoom并在没有相互覆盖的情况下进行刷牙?
提前多多感谢。
答案 0 :(得分:2)
找到第一个解决方案:
最后,我的决定是在状态发生变化时重新声明事件定义,最后得到以下代码:
setAreaMode: function () {
var self = this;
if (self.get('selectAreaMode')===true) {
self.setCursorToCrosshair();
/* Deactivating zoom tool */
self.get('zoomer').on('zoom', null);
/* Adding brush to DOM */
d3.select('svg').append('g')
.attr('class', 'brush')
.attr("pointer-events", "all")
.datum(function() { return { selected: false, previouslySelected: false};});
/* Attaching listeners to brush */
d3.select('.brush').call(self.get('brush').on('brushstart', function (d) { self.brushStart(d3.event, this,d) })
.on('brush', function (d) { self.brush(d3.event, this,d) })
.on('brushend', function (d) { self.brushEnd(d3.event, this,d) })
);
} else if (self.get('selectAreaMode')===false) {
self.setCursorToDefault();
/* Activating zoomer */
self.get('zoomer').on('zoom', function (d) { self.zoomFunction(d3.event, this,d) });
/* Deactivating listeners brush tool */
d3.select('.brush').call(self.get('brush').on('brushstart', null)
.on('brush', null)
.on('brushend', null));
/* Removing brush from DOM */
d3.select('.brush').remove();
}
}
还有其他想法吗?