D3.js V4 和 Angular 不会发生节点转换

2024-03-27

我在用角度打字稿 with D3.js V.4.12我特别使用整齐的径向树 https://bl.ocks.org/mbostock/4063550用于代表产品。

初始步骤

随着ng-cli,我安装了npm install --save d3并创建了一个组件来显示信息。

可视化如下图所示:

各自的组成部分如下:

树诊断组件.ts

import { Component, OnInit, ViewEncapsulation} from '@angular/core';
import * as d3 from 'd3';
import { ont, ont_highchair } from '../fd-ontology/ontology';
import { recursionParse, ontNode } from './model/recursion';
export class leaf {
  name: string;
  url: string;
  color: string;
  children: leaf[] = [];
}

@Component({
  selector: 'app-treediag',
  templateUrl: './treediag.component.html',
  styleUrls: ['./treediag.component.css'],
  encapsulation: ViewEncapsulation.None
})

export class TreediagComponent implements OnInit {
  prop = {name: 'test'};
  constructor() {
  }

  ngOnInit() {
    var i = 0,
    duration = 750, root;
    var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    g = svg.append("g").attr("transform", "translate(" + (width / 2 + 40) + "," + (height / 2 + 90) + ")");

    var tree = d3.tree()
    .size([2 * Math.PI, 400])
    .separation(function(a, b) { return (a.parent == b.parent ? 1 : 10) / a.depth; });

    root = tree(d3.hierarchy(this.parse_node(ont_highchair.completeStructure)));
    // root.children.forEach(collapse);
    // update(root);
    var link = g.selectAll(".link")
    .data(root.links())
    .enter().append("path")
      .attr("class", "link")
      .attr("d", d3.linkRadial()
          .angle(function(d) { return d.x; })
          .radius(function(d) { return d.y; }));

    var node = g.selectAll(".node")
          .data(root.descendants())
          .enter().append("g")
            .attr("class", function(d) { return "node" + (d.children ? " node--internal" : " node--leaf"); })
            .attr("transform", function(d) { return "translate(" + radialPoint(d.x, d.y) + ")"; })
            .on("click", (d) => click(d))
            .on("dblclick", (d) => dblclick(d));

            node.append("circle")
              .attr("r", 5)
              .style("fill", (d) => {
                if (d.data.color === 'green') {
                  return '#0f0';
                } else {
                  if (d.depth === 0) {
                    return '#999';
                  }
                  return '#f00';
                }
              });

          node.append("text")
              .attr("dy", "0.31em")
              .attr("x", function(d) { return d.x < Math.PI === !d.children ? 6 : -6; })
              .attr("text-anchor", function(d) { return d.x < Math.PI === !d.children ? "start" : "end"; })
              .attr("transform", function(d) { return "rotate(" + (d.x < Math.PI ? d.x - Math.PI / 2 : d.x + Math.PI / 2) * 180 / Math.PI + ")"; })
              .text(function(d) { return d.data.name; });


    function radialPoint(x, y) {
          return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
    }

    /* PROBLEM HERE*/
    function click(d) {
        d3.select(this).select("circle").transition()
            .duration(750)
            .attr("r", 16);
    }
    /* PROBLEM HERE */
    function dblclick(d) {
      console.log(d.data);
      d3.select(this).select("circle").transition()
        .duration(750)
        .attr("r", 6);
    }
}

this.parse_node()只是一个函数,它接受一个JSON来自服务器的响应并扁平化层次结构。

我在用.transistion()到节点上,这样单击节点将增加节点半径,双击会将半径减小回标准大小。

我没有在控制台中检索到任何错误,并通过以下方式正确获取节点的信息console.log()调用这两个函数。

然而我觉得奇怪的是浏览器检查器显示相同g组件被生产两次。也许这可能是一个问题,但我没有看到点击时发生任何转换。


当您像这样设置点击处理程序时:

.on("click", (d) => click(d))

粗箭头表示法保留了上下文this,所以它指的是你的类的实例。

不过,你的处理程序:

function click(d) {
    d3.select(this).select("circle").transition()
        .duration(750)
        .attr("r", 16);
}

正在期待this成为g被点击了。

因此,设置您的处理程序,如下所示:

.on("click", click)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3.js V4 和 Angular 不会发生节点转换 的相关文章

随机推荐

  • 需要使用油脂猴脚本点击出价按钮

    我有点卡住了 我正在尝试创建一个油脂猴脚本 该脚本将自动单击拍卖网站上出现的弹出窗口 我有 Xpat 但我对 GM 的经验太丰富 无法让它发挥作用 这是我从 fire finder for firebug 获得的元素检查线
  • Sublime Text 中的边界敏感 Cmd+D

    我在 OSX 上使用 Sublime Text 3 Using cmd D I want to select the next instance of es but not if it s part of another word 鉴于此代
  • 如何从 Google App Engine for Java 调用 Google App 脚本

    我有一个谷歌应用程序脚本 我想从 Google App Engine for Java 调用它 有人可以指导如何调用这样的脚本吗 我试着用谷歌搜索这个 但只找到了很多关于如何进行相反操作的信息 请指教 6个月前我也有同样的问题 我可以使用脚
  • 缩短本地 jekyll 服务器的页面生成时间

    跑步时jekyll server 整个站点被重建 在足够大的站点上 这需要非常长的时间 即使与 auto标志 这应该会阻止整个站点重新生成 但完成时间相当长 对我来说 10 多秒 据报道对某些人来说需要几分钟 这在编辑和预览单个页面时很不方
  • NDK:libm 静态链接

    我在尝试使用最新的 android 9 x86 平台编译源代码时遇到问题 主要问题 为什么是静态库libm a和动态的libm so是不同的 问题是我尝试编译 path to android ndk r8 toolchains x86 4
  • 数据类型不一致:预期的 NUMBER 变为 BINARY

    我是 Hibernate 新手 我正在尝试对我创建的 Oracle 数据库进行 简单 用户插入 我使用 Netbeans Hibernate 向导创建了所有必需的文件 hibernate cfg xml hibernate reveng x
  • 如何在c#中向图标添加文本?

    我想在系统托盘中显示一个图标 ico 文件 并在运行时添加一些文本 有没有原生的 WPF 方法可以做到这一点 或 GDI 的片段也将不胜感激 谢谢 这是对我有用的代码 public static Icon GetIcon string te
  • 为什么使用 pandas apply 时会出现 KeyError?

    我正在参加 kaggle Outbrain 竞赛 我的代码中引用的所有数据集都可以在以下位置找到 https www kaggle com c outbrain click prediction data https www kaggle
  • 在C++中,向量函数push_back会增加空数组的大小吗?

    快问 假设我声明了一个大小为 20 的向量 然后我想使用 push back 添加一些整数 vector
  • 使用 RVM 安装 Ruby 2.0.0,配置错误

    我目前正在 Ruby 1 9 3p134 上运行 并尝试使用 RVM 安装 Ruby 2 0 0 但是我不断遇到以下错误 我在 OSX 10 7 5 上运行 运行 env LDFLAGS L opt sm pkg active lib 时出
  • 将整个 *ui 文件加载到另一个 *.ui 文件的框架/小部件中

    我正在为家庭项目开发一个小型用户界面 我使用 QT Designer 创建了一个 ui 文件 这是我的主窗口 带有一些导航按钮 标签等 现在 当我单击导航按钮时 我正在努力在主窗口的框架或小部件中加载另一个 ui 例如内容 我正在使用 py
  • jhipster细粒度授权,删除基于ROLE的授权

    我一直在寻找如何删除基于角色的授权并将其替换为细粒度授权 我所说的细粒是指 所有方法都有一个 PreAuthorize isAuthorize GETCLIENT 或直接 IsAuthorize GETCLIENT 如果用户在授权列表中有G
  • 删除孤立行的优雅方法?

    我有一个表 其中包含大量包含客户 ID 的历史记录条目 有一个单独的客户表 有时 某些客户条目会被删除 有没有一种简单的方法 无需循环遍历每个历史记录条目 即可删除历史表中客户 ID 不再存在的所有行 因为客户行已被删除 delete fr
  • 在 bevy-engine 中处理许多精灵的最快方法

    我正在使用 Rust 和 BevyEngine 构建元胞自动机可视化 游戏 目前 在初始化世界时 我为每个单元格生成一个精灵 在每次更新中 精灵的颜色都会根据它是活着还是死了而改变 for grid pos mut color mat in
  • Ember CLI 实时重新加载不工作

    我见过其他类似的问题here https stackoverflow com questions 25439380 live reload not working with ember cli and here https stackove
  • 加强托管线程和操作系统线程之间的关系(CUDA 用例)

    Problem 我正在尝试创建一个与 net 良好集成的 CUDA 应用程序 设计目标是拥有多个可以从托管代码调用的 CUDA 函数 数据还应该能够在函数调用之间保留在设备上 以便可以将其传递给多个 CUDA 函数 重要的是 每个单独的数据
  • 导入某种语言字母表中的所有字母

    是否可以将某种语言 土耳其语 波兰语 俄语等 的字母表中所有可能的字母 小写 大写等 导入为 python 列表 有特定的模块可以做到这一点吗 你的问题与一个更大的问题有关 某些语言的字母表如何存储在计算机中 它们如何表示 以及 最终 如何
  • 如何仅在服务器调用 PHP 脚本时运行它

    我有一个 PHP 脚本 只有在服务器本身调用它时才会运行 像这样 form submit 运行 AJAX 请求来 POST 表单数据 我不想开发一个哈希解码和编码系统来证明请求是否被允许 是否可以简单地检查 服务器是否运行脚本 或客户端是否
  • 特质不就是简单的组合吗?

    我正在阅读一篇有关 PHP 5 4 0 中的新功能的文章 最值得期待的之一是Traits http php net traits 阅读这些内容Traits 看看它们的全部内容 对我来说它们只是编译器辅助的复制粘贴 一种语言提供了使用组合的方
  • D3.js V4 和 Angular 不会发生节点转换

    我在用角度打字稿 with D3 js V 4 12我特别使用整齐的径向树 https bl ocks org mbostock 4063550用于代表产品 初始步骤 随着ng cli 我安装了npm install save d3并创建了