d3.js – d3过滤器选择不工作?

前端之家收集整理的这篇文章主要介绍了d3.js – d3过滤器选择不工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
或者我没有正确使用d3的 selection.filter,或者它是错误的.我可以把问题解释一下.我正在Chrome调试器中加载d3.我们从空的选择开始吧
d3.selectAll("nonexistant").empty()
> true

并绑定一些数据.

d3.selectAll("nonexistant").data([1,2,3,4])
> [Array[4]]

好,所以它的大小四.让我们来看看selection.size

d3.selectAll("nonexistant").data([1,4]).size()
> 0

嗯,我想这是因为没有DOM元素,更新选择是空的,因为没有以前的元素.所以让我们进入输入选择.

d3.selectAll("nonexistant").data([1,4]).enter()
> [Array[4]]
d3.selectAll("nonexistant").data([1,4]).enter().size()
> TypeError: undefined is not a function
d3.selectAll("nonexistant").data([1,4]).enter().append("p").size()
> 4

不知道为什么输入选择导致错误(更新:在v3.4.12中修复),但无论如何,如果我们尝试使用文档中的示例函数进行过滤,

function odds(d,i) { return i & 1; }
d3.selectAll("nonexistant").data([1,4]).filter(odds);
> [Array[0]]
d3.selectAll("nonexistant").data([1,4]).enter().filter(odds);
> []
d3.selectAll("nonexistant").data([1,4]).enter().append("p").filter(odds)
> [Array[2]]

为什么当没有DOM元素绑定时,它会静默地过滤所有元素?当我已经拥有DOM元素时,它似乎工作正常.但是感觉很无用,因为我不想为丢弃的数据创建元素.也许如果我把过滤器提早?

d3.selectAll("nonexistant").data([1,4]).filter(odds).enter().append("p").size()
> TypeError: undefined is not a function
d3.selectAll("nonexistant").data([1,4]).enter().filter(odds).append("p").size()
> TypeError: undefined is not a function

不.似乎去的方式是与JS的本机filter在阵列上:

d3.selectAll("nonexistant").data([1,4].filter(odds)).enter().append("p").size()
> 2

d3文档似乎不区分具有DOM元素绑定的选项和不具有DOM元素的选择.看来我应该能够将过滤器放在我的方法链中的任何位置(并且在任何选择上调用大小),并获得正确的结果而不会出现类型错误.过滤器还支持需要DOM元素的CSS选择器,但是我没有在这里使用它们.

我想知道什么:d3在做什么和我期望的不匹配.我在多大程度上怀疑有关选择的误解,哪些操作对他们有效?文件在多大程度上不清楚?是否有任何这种行为有资格作为错误

解决方法

从.0 the documentation的.enter()方法

… the entering selection only defines append,insert,select and call operators; you must use these operators to instantiate the entering nodes before modifying any content. (Enter selections also support empty to check if they are empty.)

调用其他任何东西都不会产生有用的结果.这是否是一个错误,副作用或功能也许是有争议的.在几乎所有情况下,它不会产生任何障碍,除非您需要知道此选择的大小()以了解您传递给数据()的数组中的基准数据是否还没有创建元素.

一旦你在进入的选择中调用append(),它的行为就像任何正常的选择一样.实际上,append()返回一个新的选择,所以它!==的返回值为enter().

那就是你也可以检查这个选择的大小(),所以真的只有当你需要知道大小调用append()时才算是一个问题.

你是正确的使用本机阵列过滤器是解决方案,如果你不需要甚至附加元素,其中odds(d)== false.

当您已经创建了绑定到[1,4]的DOM节点(例如< p> s)时,过滤器很有用,(例如,在用户点击“突出显示所有可能性”的事件处理程序中“按钮)你打电话

d3.selectAll('p').filter(odds).css('color','red')

BTW,这是一个非常好的问题.

猜你在找的JavaScript相关文章