我想在d3中绘制几个矩形。我有一个数组,其中包含矩形属性的JSON对象。
var rectObj = {
id : 'streams',
x : 10,
y : 10,
height : 50,
width : 100,
drag:'true'
};
有些矩形有draggable ='true',而其他矩形有draggable ='false'。
我想在单个SVG中绘制所有矩形。他们这样做的方式是,
var rectangles = mainLayout
.selectAll('rect')
.data(rectObjects)
.enter()
.append('rect');
rectangles
.attr("x", function (d) { return d.x; })
.attr("initial-x", function (d) { return d.x; })
.attr("y", function (d) { return d.y; })
.attr("initial-y", function (d) { return d.y; })
.attr("height", function (d) { return d.height; })
.attr("width", function (d) { return d.width; })
.attr("fill", function () { return "white"; })
.attr("stroke", function () { return "black"; })
.style("stroke-width", function() { return "1 px"; })
.attr("draggable",function(d){return d.drag;})
.call(dragStream)
;
在dragStream上,我想停止执行拖动功能。也就是说,那些矩形不应该拖动任何东西。
var dragStream= d3.behavior.drag()
.on('dragstart', function(){
console.log('drg' + d3.select(this).attr('draggable'));
if(d3.select(this).attr('draggable') == 'false'){
// what should I do here ?
}
})
.on('drag', move /* this function is defined and works well*/)
.on('dragend', function(){ // I do some stuff here
});
我应该怎样做才能达到上述要求?
答案 0 :(得分:2)
您需要区分拖动事件,而不是dragstart。
.on('drag', function(d, i) { if(d3.select(this).datum().drag) move.call(this, d, i); }).
如果您使用.datum()
。那么你不需要写任何属性。当d3将数据绑定到选择它存储在DOM元素上时,您可以使用.datum()
访问它。它返回的值是对数据数组对象的引用,因此您可以访问那里的drag
属性。