gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:15:21 25 4
gpt4 key购买 nike

我正在使用 Angular TypescriptD3.js V.4.12,我特别使用 Tidy Radial Tree用于代表产品。

初始步骤

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

可视化如下图所示:

d3 tidy tree for product

各自的组成部分如下:

treediag.component.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 组件被生成了两次。也许这可能是个问题,但我没有看到点击时发生任何转换。

browser inspector

最佳答案

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

.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)

关于angular - D3.js V4 和 Angular 不会发生节点转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48227387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com