为什么当enter()被链式调用时,D3.js数据仅对子节点可用,而不是单独调用

2023-12-12

我正在尝试遵循迈克·博斯托克 (Mike Bostock) 的说法似乎表明是最佳实践,即分配你的selectAll()到一个变量,然后分离出更新,enter()exit(),但我注意到 V4 中有一个我无法解释的差异。

考虑以下工作代码:

// Bind an array of users to the #users div
        var userNodes = d3.select("#users").selectAll("li")
            .data(d3.values(users))

            // Add LIs for any new users
            .enter()
                .append("li");

        var userMessageGraph = userNodes.selectAll("span")
            .data(function(d){ return [d.name]; })
            .enter().append("span")
                .text(function(d){ return d; });

它创建一个空的 LI,然后在其中附加一个带有用户名的 SPAN。 (顺便说一句,如果这就是我想要的,我确信有更好的方法,但这只是为了说明我的观点而减少了其他内容。请耐心等待。)

现在我尝试通过运行以下命令来使其适应我对上述最佳实践的解释enter()针对存储的变量,子元素将失去与父数据的链接。我得到了一个空 LI 列表。

// Bind an array of users to the #users div
        var userNodes = d3.select("#users").selectAll("li")
            .data(d3.values(users));

        // Add LIs for any new users
        userNodes.enter()
            .append("li");

        var userMessageGraph = userNodes.selectAll("span")
            .data(function(d){ return [d.name]; })
            .enter().append("span")
                .text(function(d){ return d; });

Update 1

嗯,读完之后[~杰拉尔多·弗塔多]的回应,我以为我已经得到了。显然我在这里遗漏了一个基本原则。

这是我尝试使用的代码merge()确保数据被传递到子元素,但没有任何乐趣:

var userNodes = d3.select("#users").selectAll("li")
        .data(d3.values(users));

        // Add LIs for any new users
        userNodes.enter()
            .append("li")
            // New for V4, merge back the original set to get the data
            .merge(userNodes);

        var userMessageGraph = userNodes.selectAll("span")
            .data(function(d){ return [d.name]; })
            .enter().append("span")
                .text(function(d){ return d; });

我想你正在使用 d3 v4.x。在这种情况下,这就是预期的行为。

这就是正在发生的事情:userNodes是数据绑定变量:

var userNodes = d3.select("#users").selectAll("li")
    .data(d3.values(users));

然后,你写:

userNodes.enter()
    .append("li");

这就是“输入”选择。

在 d3 v3.x 中输入选择神奇地修改你的原始变量,将其变成这样:

var userNodes = d3.select("#users").selectAll("li")
    .data(d3.values(users));
    .enter()
    .append("li");

但是,在 d3 v4.x 中,原始变量仍然只是数据绑定选择:

var userNodes = d3.select("#users").selectAll("li")
    .data(d3.values(users));

所以,如果我们重写你的userMessageGraph考虑到链接,这就是它的实际情况:

var userMessageGraph = d3.select("#users")//here userNode starts
    .selectAll("li")
    .data(d3.values(users))//this is where userNode ends
    .selectAll("span")
    .data(function(d){ return [d.name]; })
    .enter().append("span")
    .text(function(d){ return d; });

您可以看到“输入”选择<li>,这是...

.enter()
.append("li")

...不见了。

EDIT:此编辑解决了 OP 的新代码:

var userNodes = d3.select("#users").selectAll("li")
    .data(d3.values(users));

// Add LIs for any new users
userNodes.enter()
    .append("li")
    // New for V4, merge back the original set to get the data
    .merge(userNodes);

这行不通是有原因的:merge功能...

...返回一个新的选择,将该选择与指定的其他选择合并。返回的选择具有相同数量的组和相同的父项this选择。 (强调我的)

As userNodes是一个空选择,这将不起作用。您可以反转逻辑:

var userNodes = d3.select("#users").selectAll("li")
    .data(d3.values(users));

var userNodesEnter = userNodes.enter()
    .append("li");

var userNodesUpdate = userNodesEnter.merge(userNodes);

var userMessageGraph = userNodesUpdate.selectAll("span")
    .data(function(d) {
        return [d.name];
    })
    .enter().append("span")
    .text(function(d) {
        return d;
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么当enter()被链式调用时,D3.js数据仅对子节点可用,而不是单独调用 的相关文章

随机推荐

  • JavaScript 中的 HTML 助手?

    在 Razor 中我可以这样做 p person Name p 要渲染这样的东西 p Fred p 我真的必须在 不引人注目的 JavaScript 中执行此操作吗 p data custom person id 1234567890 cs
  • IE8 中的不透明度适用于

    ,但不适用于

    我的 IE8 有问题 无法执行 a 元素透明 我发现了这些相关的问题 但我对那里提供的答案没有任何运气 不透明度 CSS 在 IE8 中不起作用 网页不透明 我试过了 给予布局 通过使用zoom 1 但这并没有帮助 这是我的测试 CSS 摘
  • Matplotlib 在图像上制作动画

    我正在尝试为图像上的一堆不断更新的点设置动画 想象一下使绘制的点在某些图像上对角移动 我在这里查看了动画示例 http matplotlib org examples animation dynamic image html 但我不确定如何
  • 在 cxf Servlet 上找不到资源类

    我创建了一个非常简单的 cxf 非基于 spring 的 Servlet 它加载一个javax ws rs Application type 这是 web xml
  • 将 COM 对象动态转换为 COM 接口不会增加引用计数,不是吗?

    如果我有一个 C 类 X 它实现了 COM 接口 IY 和 IZ 并且我有一个指向 X 类型对象的 IY 接口的指针 y 我会这样做 IZ z dynamic cast
  • Sqlite3 / python - 从sqlite导出到csv文本文件不超过20k

    我正在尝试将 sqlite 表导出到文本文件 我在这个站点上找到了一些很大的帮助 它对于较小的输出非常有效 但一旦我达到 20k 左右 它似乎就会限制输出 第一次尝试是 Mark Bell 的 Unicode Writer 位于是否可以将表
  • Visual Studio 中的“优化代码”选项到底有什么作用?

    选项的名称说明了一些事情 但是 Visual Studio 编译器到底做了什么以及真正的后果是什么 编辑 如果你搜索谷歌你可以找到这个地址 但这并不是我真正想要的 我想知道真实发生的事情 例如为什么循环的时间更少等等 如果没有优化 编译器会
  • mongodb:如何通过索引号更新数组元素

    假设您有这样的文档 id sdsdfsd a x 0 y 0 z 0 x 0 y 0 z 0 x 0 y 0 z 0 x 0 y 0 z 0 所以 如果你有 id和一个索引号 比如 2 现在 对于该索引我想更改x值为 1 这在 mongo
  • 与 @Autowired 的绑定在以“new”启动的实例内不起作用

    在我的 web spring 应用程序中 我创建一个带有关键字的实例new如下 在我的动作类之一中 存在以下方法 public void process MyBean b new MyBean initiated the instance
  • 如何使用 Glide 库对图像进行圆角处理?

    那么 有人知道如何用 Glide 显示圆角图像吗 我正在使用 Glide 加载图像 但我不知道如何将舍入参数传递给该库 我需要显示图像 如下例所示 滑翔V4 Glide with context load url circleCrop in
  • Python字典创建错误

    我正在尝试从存储的列表创建 Python 字典 第一种方法有效 gt gt gt myList gt gt gt myList append Prop1 gt gt gt myList append Prop2 gt gt gt myDic
  • 使用 Apache Solr 索引 pdf 文件内容

    我正在使用 Solrphp 扩展用于与 Apache Solr 交互 我正在从数据库中索引数据 我还想索引外部文件 如 PDF PPTX 的内容 索引的逻辑是 假设schema xml定义了以下字段
  • 美国各州和城市的 Tiger/Lines 或 shapefile?

    我被要求根据美国的州和城市生成一些人口统计报告 犯罪率 出生 死亡等 我拥有所有人口统计数据 由我们的客户提供 但似乎找不到任何有美国各州及其城市边界 阅读 纬度 经度 的地方 我们的数据是经纬度数据点 例如犯罪 出生等 我们希望获得一些映
  • 使用 actix-web 2.0 提供静态文件

    我正在与 Rust 的 actix web 2 0 框架作斗争 我希望我的 rust 服务器能够为我的 index html 文件提供服务 但大多数可用的帮助都是旧版本的 因此新版本中发生了很多变化 我尝试了以下代码 但它不适用于 acti
  • 如何创建主屏幕快捷方式以恢复顶级活动

    我有一些代码可以在第一次运行时添加主屏幕的快捷方式 Intent shortcutIntent new Intent getApplicationContext SFlashActivity class shortcutIntent set
  • TypeScript 中类和对象字面量之间的类型检查

    在 TypeScript 中 如果该对象提供了类所需的所有属性和方法 则可以将对象字面量分配给类类型变量 class MyClass a number b string Compiler won t complain const insta
  • 使用命令行调用 IISExpress 来托管 ASP.NET Core 应用程序 [重复]

    这个问题在这里已经有答案了 我有一个服务依赖于许多其他服务 在开发期间 我只是启动所有其他服务 手动使用 VS 2017 为了避免该步骤 我尝试使用以下命令创建一个批处理文件 以使用 IISExpress 托管我的 ASP NET Core
  • SSIS BIML 生成带括号的 SQL 代码

    我使用 BIML 为 SSIS 动态创建加载包 以将数据从 Informix 加载到 SQL Server 问题是这个 BIML 代码生成下面的 SQL
  • 使用jsonpath获取父节点

    使用节点JSONPath 如何从子节点值获取父节点名称 store book id 1 author Nigel Rees title Sayings of the Century price 8 95 id 2 author Evelyn
  • 为什么当enter()被链式调用时,D3.js数据仅对子节点可用,而不是单独调用

    我正在尝试遵循迈克 博斯托克 Mike Bostock 的说法似乎表明是最佳实践 即分配你的selectAll 到一个变量 然后分离出更新 enter 和exit 但我注意到 V4 中有一个我无法解释的差异 考虑以下工作代码 Bind an