这是一个创建未附加组元素的示例函数:
function createSomething(){
return function(){
var group = d3.select(document.createElementNS(d3.ns.prefix.svg, 'g'));
// Add stuff...
return group.node();
}
}
你可以这样称呼它:
node.append(createSomething());
解释
假设您正在渲染一个可折叠的树,并且您希望将带有圆形边框的加号/减号图标作为切换。您的绘图函数已经非常庞大,因此您希望将用于绘制加号的代码放入它自己的函数中。绘制/更新方法将负责正确定位。
一种选择是将现有容器传递给函数:
createPlus(node).attr({
x: 10,
y: 10
});
function createPlus(node){
var group = node.append('g');
// Add stuff...
return group;
}
我们可以通过应用@Drew 和@Paul 的技术来创建未附加的元素来使这一点变得更好。
node.append(createPlus())
.attr({
x: 10,
y: 10
});
function createPlus(){
var group = d3.select(document.createElementNS(d3.ns.prefix.svg, 'g'));
// Add stuff...
return group;
}
除了抛出错误,因为append()
需要一个字符串或一个函数。
名称可以指定为常量字符串,也可以指定为返回要追加的 DOM 元素的函数。
所以我们只需将其更改为:
node.append(function(){
return createPlus();
});
但这仍然行不通。它会导致以下错误:
TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
幸运的是,我发现selection.node()
哪个有效!虽然,诚然,我不知道为什么。
function createPlus(){
var group = d3.select(document.createElementNS(d3.ns.prefix.svg, 'g'));
// Add stuff...
return group.node();
}
我们可以通过将匿名函数移动到createPlus
:
node.append(createPlus())
function createPlus(){
return function(){
var group = d3.select(document.createElementNS(d3.ns.prefix.svg, 'g'));
// Add stuff...
return group.node();
}
}