Meteor-D3 SVG应用:defs追加操作影响selectAll数据绑定及'd'未定义报错
问题2:添加mask时出现'd未定义'的类型错误
这个错误的本质是:你在没有数据绑定的代码块里引用了数据参数d——d只有在数据绑定后的元素回调函数里才会存在,脱离这个上下文直接用肯定会报错。
结合你的绘图板场景,常见的触发情况有两种:
创建mask子元素时误用了
d:比如你在defs里给mask加rect/circle这类元素时,直接写了d => ...的回调,但这些mask元素根本没绑定任何数据,自然找不到d。
错误示例:defs.append('mask') .attr('id', 'color-overlay-mask') .append('rect') .attr('width', d => d.width) // 这里的d完全不存在!修正方式:如果mask是覆盖整个SVG的,直接用SVG的宽高就行;如果是针对单个圆形的,那得给mask的元素绑定对应圆形的数据:
// 针对全局mask的情况 const svgDim = { width: +svg.attr('width'), height: +svg.attr('height') }; defs.append('mask') .attr('id', 'color-overlay-mask') .append('rect') .attr('width', svgDim.width) .attr('height', svgDim.height) .attr('fill', yourTargetColor);给圆形绑定mask时误用了
d:比如你想给每个圆形用不同的mask,但是把d直接写在了字符串模板里,没放在回调函数中。
错误示例:svg.selectAll('.brush-dot') .attr('mask', `url(#mask-${d.id})`); // 这里的d不在当前作用域修正方式:把
attr的第二个参数改成回调函数,这样d就能正确引用每个圆形的数据对象了:svg.selectAll('.brush-dot') .attr('mask', d => `url(#mask-${d.id})`);
另外可以检查下:添加mask后有没有不小心改动原来的数据绑定逻辑,比如把selectAll的范围搞错了,导致某些元素没拿到d。
内容的提问来源于stack exchange,提问作者Aeon Avinash
相关产品推荐
相关产品推荐

