79 votes

Utiliser D3.js avec Angular 2

J'ai intégré avec succès Angular 2 (Alpha 44) avec 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);

Tout fonctionne bien. Mais la documentation d'Angular 2 pour ElementRef indique ce qui suit :

Utilisez cette API en dernier recours lorsqu'un accès direct au DOM est nécessaire. Utilisez plutôt le templating et le data-binding fournis par Angular. Vous pouvez également jeter un coup d'œil à {@link Renderer} qui fournit une API pouvant être utilisée en toute sécurité même lorsque l'accès direct aux éléments natifs n'est pas pris en charge. S'appuyer sur l'accès direct au DOM crée un couplage étroit entre votre application et les couches de rendu, ce qui rendra impossible la séparation des deux et le déploiement de votre application dans un web worker.

Maintenant, la question se pose de savoir comment intégrer D3.js avec les API de rendu ?

58voto

Eric Martinez Points 4489

Pour utiliser Renderer, vous avez besoin de l'élément HTML brut (aka nativeElement). Vous devez donc utiliser votre bibliothèque, quelle qu'elle soit, pour récupérer l'élément brut et le passer à Renderer.

Par exemple

// h3[0][0] contains the raw element
var h3 = d3.select(this.el.nativeElement).select('h3');
this.renderer.setElementStyle(h3[0][0], 'background-color', 'blue');

L'avertissement concernant ElementRef concerne son utilisation directe. Cela signifie que cette utilisation est déconseillée

elementRef.nativeElement.style.backgroundColor = 'blue';

Mais c'est bien

renderer.setElementStyle(elementRef.nativeElement, 'background-color', 'blue');

Pour les besoins de la démonstration, vous pouvez également l'utiliser avec jQuery.

// h2[0] contains the raw element
var h2 = jQuery(this.el.nativeElement).find('h2');
this.renderer.setElementStyle(h2[0], 'background-color', 'blue');

Je vous recommande cependant de vous en tenir à ce qu'angular2 vous fournit pour faire cela facilement sans dépendre d'autres bibliothèques.

Avec angular2 pur, vous disposez de deux moyens simples

  • Utilisation des directives

    // This directive would style all the H3 elements inside MyComp @Directive({ selector : 'h3', host : { '[style.background-color]' : "'blue'" } }) class H3 {}

    @Component({ selector : 'my-comp', template : '<h3>some text</h3>', directives : [H3] }) class MyComp {}

  • Utilisation de ViewChild avec des variables locales

    @Component({ selector : 'my-comp', template : '<h3 #myH3>some text</h3>', }) class MyComp { @ViewChild('myH3') myH3; ngAfterViewInit() { this.renderer.setElementStyle(this.myH3.nativeElement, 'background-color', 'blue'); } }

Voici un plnkr avec tous les cas que j'ai mentionnés dans cette réponse. Vos besoins peuvent être différents, bien sûr, mais essayez d'utiliser angular2 chaque fois que vous le pouvez.

-5voto

Ranga Points 44

Vous devez en fait mentionner la dépendance d3 lors de la création du module angulaire, comme suit

angular.module('d3', [])
  .factory('d3Service', ['$document', '$q', '$rootScope'

Vous pouvez vous référer à l'intégration complète d'angular avec d3 sur github.

http://www.ng-newsletter.com/posts/d3-on-angular.html

https://gist.github.com/auser/6506865#file-d3-example1-js

à partir de là, j'espère que vous pourrez intégrer l'Angular avec De bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X