【发布时间】:2016-01-27 21:34:18
【问题描述】:
我已成功将 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);
一切正常。但 ElementRef 的 Angular 2 文档声明如下:
当需要直接访问 DOM 时,将此 API 用作最后的手段。改用 Angular 提供的模板和数据绑定。或者,您可以查看 {@link Renderer},它提供了即使不支持直接访问本机元素也可以安全使用的 API。依赖直接 DOM 访问会在您的应用程序和渲染层之间创建紧密耦合,这将导致无法将两者分开并将您的应用程序部署到 Web Worker 中。
现在的问题是如何将 D3.js 与 Renderer API 集成?
【问题讨论】:
-
我也在尝试让 D3 与 angular 2 一起工作。在上面的示例中,我可以看到您在 index.html 中引用了 d3 脚本,但我看不出您是如何获取 app.js 中的 d3 变量?
-
@user2915962 - npm install d3 ,确保安装后运行并且 d3.d.ts 由 tsd 创建,然后
import * as d3 from 'd3/d3'; -
这里有一个 cmets 提到的视频:stackoverflow.com/q/34704148/2050479 很有趣
-
@urosjarc - 那是 Angular 1,它有一种非常不同的方式来做这些事情。