我们可以在这里使用这个Angular示例(https://bl.ocks.org/d3noob/1a96af738c89b88723eb63456beb6510)并实现可折叠的树图。但它没有折叠回其父节点,或者我们的单击操作无法正常工作。
下面是我的代码:https://stackblitz.com/edit/angular-ivy-acd2yd?file=src/app/app.component.ts
我们可以在这里使用这个Angular示例(https://bl.ocks.org/d3noob/1a96af738c89b88723eb63456beb6510)并实现可折叠的树图。但它没有折叠回其父节点,或者我们的单击操作无法正常工作。
下面是我的代码:https://stackblitz.com/edit/angular-ivy-acd2yd?file=src/app/app.component.ts
2条答案
按热度按时间jfgube3f1#
将代码从JS转换为typeScript不仅仅是复制+粘贴。我们得慢点。
首先,在typescript中,我们使用
let
或const
来拥有一个块作用域,而不是var
。“var”创建一个对所有应用程序全局的变量之后,我们不需要把所有的代码都放在ngOnInit中。我们应该在函数中分离ngOnInit下的所有代码。我们可以在ngOnInit之外声明变量
我们还需要得到函数,所以我们有函数
并且transfor所有函数都使用了平箭头sintax,所以
并使用
this.
来引用组件的变量。在所有这些之后,Out ngOnInit就变成了
功能更新
看到有一个小的变化,因为我选择使用viewPort来使svg填充屏幕的宽度,如果它小于960px,并使用.css控制“点”的类(在代码中,它是“硬编码”的“点的填充”)
所以,之前,当我们创建.svg时,我们给予width和height值,现在我给予viewBox值。
最后,我们创建一个组件,而不是在app.component中编写代码。为此,我们需要输入一些变量
最后是用评论的方式给予作者的肯定
由于我选择的svg是自适应的,我们需要计算“边距”,以允许第一个节点的文本可见。为此,我用this节点的文本创建了一个“visibility:hidden”span来计算“margin”。然而,我希望文本是可见的,所以强制字体大小约为14px,以创建一个可观察的方式
最后的stackblitz is here(你可以比较代码)
更新我真的不喜欢这么多的结果
在this stackblitz中,我改进了一些代码。不同的是,我改变了宽度,高度和viewPort使用一个函数
为了避免“裁剪”,我更改了节点之间的“hardode”空间
其中,.maxDepth是使用关于treeData的递归函数计算的
我还需要使用“保证金”变量,我硬编码一样
允许SVG不裁剪文本
zrfyljdw2#
这个答案是另一个答案的继续。我改进了stackblitz不硬编码的“利润率”。我知道我可以修改答案,但有很多变化。首先,我想介绍一种树。
谱写好
这将计算节点(x和y)的位置,就像“点”包含在一个100 x100 px的矩形中一样。所以我们可以“规模化”
其中“this.height”是svg的“height”,step是两个节点之间的距离。
首先,定义我们需要的几个输入:我们需要的变量
我们将“aspect-ratio”存储在变量
this.factor
中,并使用“getter”和threeData来获取“maxDepth”我想知道文本的大小,所以我想用文本创建一个字符串数组,并使用样式“隐藏:隐藏”进行绘制。我还想得到第一个文本和较大的文本,所以我们使用
我写一个模板,
我想使用media-queries更改字体大小,所以我使用
ViewEncapsultion.None
。这使得.css适用于所有的应用程序,因此,为了避免冲突,我们用组件的选择器prexis所有的.css。future.我选择使用css变量。这允许我们使用这些变量来改变节点的颜色。我们可以在风格。css使用类似
现在,我们使用ngAfterViewInit创建树,并获取“firstLabel”(“main node”的#标签)和“lastLabel”(宽度较大的标签)
updateSize更改svg的大小,同时考虑“margin”
我们使用width和height创建viewBox,使用-magin.left在viewPost中“水平平移”节点-
更新只是翻译到JS中的函数
感谢您的阅读,final stackblitz