- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 D3 构建一个小型可视化,需要将多个不同的内容绑定(bind)到同一数据元素。我有一个观点,我似乎能够让它工作的唯一方法是通过多次调用 Data()
我觉得这可能效率很低。
作为示例,这是我的加入代码:
// Sort out the data joins
var joinedGroups = segments.selectAll(".menu").data(pie(data));
var joinedSegments = segments.selectAll(".menu-segment").data(pie(data));
var joinedIcons = segments.selectAll("circle").data(pie(data));
这是一张图片来帮助说明我正在构建的内容:
在我的 DOM 中,您可以看到它们之间的关系:
<g>
<path>
<circle>
下面是 DOM 的输出来说明:
<g class="menu">
<path class="menu-segment" d="" style="fill: rgb(255, 0, 0);"></path>
<circle r="5" cx="29.999999999999996" cy="-51.96152422706632"></circle>
</g>
当时我正在使用joinedGroups
添加新的<g>
, <path>
和<circle>
元素。那时我改用 joinedSegments
更新我的饼图部分。这是我觉得错误的一点:
// Update existing segments and icons
joinedSegments.attr("d", arc);
joinedIcons.attr("cx", function(d) { return calcMidPoint(d).x; })
.attr("cy", function(d) { return calcMidPoint(d).y; });
经过思考,我得出的结论是,我现在应该能够拿走我的 joinedGroups
并选择所有 .menu-segment
实例,以获得我的所有<path>
而是元素。
joinedGroups.selectAll(".menu-segment").attr("d", arc);
此时我以为我破解了它,我不再使用 joinedSegments
所以我拿出了Data()
在顶部调用,然后它停止正常工作,错过了应该在那里的段。所以我对调用 Data()
的副作用有点困惑- 谁能解释一下发生了什么事吗?
你可以看一个例子JSFiddle此处 - 注释掉行 #123 和 #124 说明调用 Data()
的副作用我也指的是,因为黄色部分将会消失。
最佳答案
根本问题是您有嵌套元素,并且每个元素(g
、path
和 circle
)都需要具有数据绑定(bind)到它们,因为您要根据数据设置属性。
您将数据显式绑定(bind)到 g
元素(第 122 行),因此工作正常。对于输入选择,一切都正常,因为 .append()
具有将绑定(bind)数据“继承”到附加元素的副作用。问题出在更新选择上。您用来选择嵌套元素并更新其属性的 .selectAll()
(第 143 和 144 行)不会更新您所依赖的绑定(bind)数据在函数中打开以设置属性值。
有两种方法可以解决这个问题。第一个是您已经拥有的——显式选择那些嵌套元素并更新它们的数据。然而,这需要额外的代码,并且依赖于嵌套元素的顺序与其父元素相同,这是无法保证的。
更好的方法是简单地将第 143 和 144 行中的 .selectAll()
替换为 .select()
。这是可能的,因为每种类型只有一个元素嵌套在 g
下,因此选择无论如何都只包含一个元素。在这种情况下,.selectAll()
和 .select()
之间的主要区别在于,虽然 .selectAll()
不会更新绑定(bind)的数据对于选定的元素,.select()
会执行此操作。效果与您当前的解决方案相同 - 绑定(bind)到嵌套元素的数据已正确更新,只是您不需要任何额外的代码并且不依赖于所选元素的顺序。
完整演示 here .
关于javascript - 为什么我的数据选择器有副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28167871/
这2个有什么区别?一个使用 SideEffect,另一个不使用。 “每次成功重组都会调用 SideEffect”,但如果没有 SideEffect,它也会在每次重组时运行。 @Composable f
我在 DOM 元素引用方面遇到了一些问题,我想我已经追踪到它与更新 innerHTML 有关。 在这个例子中,在第一次警告时,两个变量引用同一个元素,正如预期的那样。奇怪的是,在更新父元素(body)
如果有人问过这个问题,请原谅我,但我似乎找不到它。 我正在尝试创建一个数组并反转它(不使用反转)这段代码完美运行: function reverseArrayInPlace(array) { fo
如果 reflector 是正确的(我倾向于相信它是正确的),这就是 Any() 的实现: public static bool Any(this IEnumerable source) {
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
是否可以用 LINQ 中的 lambda 表达式替换 foreach 循环 (.Select))? List l = {1, 2, 3, 4, 5}; foreach (int i in l)
我在一本书上读到以下说法: n = ((i++) > (j)?(i++):(j)); 书上说假设i>j,n有一个意想不到的值,i增加了两次。 我不明白为什么n在这句话之后有一个期望值。 我读了很多关于
我对更改 LD_LIBRARY_PATH 有奇怪的副作用。 当我附加一个包含库的路径时,例如: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 然后,一切都
有人能告诉我下面一行中“副作用”的含义吗? If you're calling an EL function that doesn't return anything, then you're cal
是否有为包含副作用的 Java/JVM 语言方法编写 javadoc 的标准或最佳实践? 我定义了一个 void 方法,它修改了方法参数之一,但不知道如何记录实际返回值(因为没有实际返回)。 /**
我正在学习副作用和纯函数。我知道纯函数没有副作用,对于相同的参数,它们的返回值是相同的。我想知道 C 函数 strcmp() 是否是纯函数。我相信它是纯粹的,因为给定相同的两个字符串作为参数,结果将始
我正在尝试创建佛罗里达州的点密度图。虽然我知道 Highmaps 不支持带有 map 点的颜色轴。我扩展了它并且它有效,但它带来了副作用。当我单击图例中的某一类别时,不会发生隐藏。例如,如果我单击“>
我在 CS50 中研究 PSET 4,似乎遇到了 sprintf 更改不相关变量的问题。我只给出了没有揭示我的解决方案的代码...... #include #include #include t
我已经实现了这样的 UnaryOperation struct Converter { Converter( std::size_t value ): value_( valu
使用点符号调用自定义 getter 是否有副作用? 我一直在通过点符号在 Objective-C 中使用合成的 getter,即 tree.fruitnumber 返回树中果实的数量。我必须自定义 s
我无法理解页面 https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/void 中的这一段: This ope
我有一个在 IIS7 下运行的 Web 应用程序。我将全局变量存储在一个带有静态变量的类中。该类称为 SessionVariables 并且在其中例如我有以下内容: public class Sess
运行命令时 ng-packagr -p ng-package.json 我得到以下输出 Building Angular library - - - skipped 8 lines - - - Sid
我想模拟一个 OverflowError 因为我想在引发异常之后测试变量的值。但是,我不知道如何使用我正在使用的库复制 OverflowError。我在此特定测试中使用的库是 pysolar.sola
当我尝试在可变 Map 中插入一个元素时,我希望这个元素插入到我的 Map 而不是返回 Map(如 PF,不可变对象(immutable对象) ecc ...)出于这个原因,我使用了可变集合,但在我的
我是一名优秀的程序员,十分优秀!