我正在尝试在Angular2项目中使用treant-js,并且在如何正确地集成它方面苦苦挣扎。
我有一个正常的JavaScript / HTML示例,试图在Angular2中工作。
我创建了一个组件,从npm中添加了treant-js和raphael,并将它们导入了该组件中。
import * as Raphael from 'raphael';
import * as Treant from 'treant-js';
我已经设置了html模板和相应的CSS,以匹配独立的javascript项目。
<div class="tree-wrapper" >
<div class="chart" id="test-tree"></div>
</div>
在课堂上,我定义了树结构变量
private tree_structure: any = {
chart: {
container: "#test-tree",
levelSeparation: 20,
siblingSeparation: 15,
subTeeSeparation: 15,
rootOrientation: "WEST",
node: {
HTMLclass: "tree-wrapper",
drawLineThrough: true
},
connectors: {
type: "straight",
style: {
"stroke-width": 2,
"stroke": "#ccc"
}
}
},
nodeStructure: {
text: {
name: { val: "Djokovic, Novak", href: "http://... }
},
HTMLclass: "animal",
image: "flags/can.jpg",
children: [...
*** the rest of the object graph continues ***
}
在JavaScript / HTML版本中,树以如下方式嵌入到内联脚本中:
<script>
new Treant( tree_structure );
</script>
在Angular2中初始化它的正确方法是什么?
我在想这样的事情:
private tree: Treant = new Treant();
ngOnInit() {
tree ( this.tree_structure );
}
但是Treant不是函数。
我确定我在这里遗漏了一些明显的东西,但是我无法解决这个问题。
最佳答案
解决方法如下:
将脚本导入index.html文件-不要通过npm添加脚本,只需将js文件加载到存储静态导入资产的任何位置,在这种情况下,我在包含静态CSS的项目的根目录中有一个资产目录文件(BootStrap)和静态图片,以及包含Treant和Raphael文件的js子目录。
<script src="/assets/js/raphael.js"></script>
<script src="/assets/js/Treant.js"></script>
然后创建一个组件,并关闭ViewEncapsulation,以便Treant CSS样式可以使用。
import { Component, Input } from '@angular/core';
import { ViewEncapsulation } from '@angular/core'
declare var Treant: any;
@Component({
encapsulation: ViewEncapsulation.None,
selector: 'treant-tree',
styleUrls: ['treant-tree.component.scss'],
template: `
<div class="treant-class" >
<div class="chart" id="treant-id"></div>
</div>
`
})
export class TreantTree {...}
我使用了网球示例,因此在您的课程中将nodeStructure创建为变量:
private tree_structure: any = {
chart: {
container: "#treant-id",
levelSeparation: 20,
siblingSeparation: 15,
subTeeSeparation: 15,
rootOrientation: "WEST",
node: {
HTMLclass: "treant-class",
drawLineThrough: true
},
connectors: {
type: "straight",
style: {
"stroke-width": 2,
"stroke": "#ccc"
}
}
},
nodeStructure: {
text: {
name: { val: "Djokovic, Novak", href: "http://www.atpworldtour.com/Tennis/Players/Top-Players/Novak-Djokovic.aspx" }
},
HTMLclass: "animal",
image: "/assets/images/flags/can.jpg",
children: []
}
(在此处观看您的括号-我已截断了上面的代码)
我已将包含所有图像的flags目录复制到/ assets / images / flags /中,并更改了nodeStructure中的路径以反映这一点。
我将所有相关的CSS样式复制到了组件的
treant-tree.component.scss
文件中。如果您在构造函数中注销Treant,则应该看到并能够扩展/查看该函数对象,只是为了确认脚本是否正确加载,但这不是必需的。
`console.log`("Treant",Treant);
然后在ngOnInit中,调用Treant并在立即调用的函数表达式中传递树结构变量。 TypeScript中的语法如下:
ngOnInit() {
(() => {Treant(this.tree_structure)})();
}
显然,为了实际使用它,您将需要抽象出树结构数据,可能通过服务进行构建并将其作为参数或@Input绑定加载到组件中,但是至少这可以使一切正常工作。