我已经成功地将Angular 2(Alpha 44)与D3.js集成:
<html>
<head>
<title>Angular 2 QuickStart</title>
<script src="../node_modules/systemjs/dist/system.src.js"></script>
<script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js" charset="utf-8"></script>
<script>
System.config({packages: {'app': {defaultExtension: 'js'}}});
System.import('app/app');
</script>
</head>
<body>
<my-app>Loading...</my-app>
</body>
</html>
app.js:
/// <reference path="./../../typings/tsd.d.ts" />
import {Component, bootstrap, ElementRef} from 'angular2/angular2';
@Component({
selector: 'my-app',
template: '<h1>D3.js Integrated if background is yellow</h1>',
providers: [ElementRef]
})
class AppComponent {
elementRef: ElementRef;
constructor(elementRef: ElementRef) {
this.elementRef = elementRef;
}
afterViewInit(){
console.log("afterViewInit() called");
d3.select(this.elementRef.nativeElement).select("h1").style("background-color", "yellow");
}
}
bootstrap(AppComponent);
一切正常运作。但是Angular 2中的ElementRef文档指出:
当需要直接访问DOM时,将此API作为最后手段使用。 相反,使用Angular提供的模板和数据绑定。 或者您可以查看{@link Renderer},它提供了一个API,即使在不支持对原生元素的直接访问时也可以安全地使用。 依赖于直接DOM访问会创建你的应用程序和渲染层之间的紧密耦合,这将使得无法将两者分开并将您的应用程序部署到Web Worker中。
现在问题是如何将D3.js与Renderer API集成?
import * as d3 from 'd3/d3';
进行导入。 - drew moore