Я успішно інтегрував 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 говорить наступне:
Використовуйте цей API як крайній засіб, коли потрібен прямий доступ до DOM. Замість цього використовуйте шаблони та прив’язку даних, надані Angular. Ви також можете поглянути на {@link Renderer}, який надає API, який можна безпечно використовувати, навіть якщо прямий доступ до власних елементів не підтримується. Спираючись на прямий доступ до DOM, ви створюєте тісне зв’язок між вашим додатком та рівнями візуалізації, що унеможливить розділення двох та розгортання вашого додатка у веб-службі.
Тепер виникає питання, як інтегрувати D3.js з API Renderer?