J'essaie d'utiliser un visjs lib mais je ne peux pas faire fonctionner leur exemple de démarrage, cela va comme ceci:
<script type="text/javascript">
// DOM element where the Timeline will be attached
var container = document.getElementById('visualization');
// Create a DataSet (allows two way data-binding)
var items = new vis.DataSet([
{id: 1, content: 'item 1', start: '2013-04-20'},
{id: 2, content: 'item 2', start: '2013-04-14'},
{id: 3, content: 'item 3', start: '2013-04-18'},
{id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'},
{id: 5, content: 'item 5', start: '2013-04-25'},
{id: 6, content: 'item 6', start: '2013-04-27'}
]);
// Configuration for the Timeline
var options = {};
// Create a Timeline
var timeline = new vis.Timeline(container, items, options);
</script>
Voici un outil simple intégrant le code que vous avez posté avec Angular 2 https://plnkr.co/edit/TbPTfXFk4RSAuPn4BBxP?p=preview
Dans cet exemple l'intégration est dans OnInit
ngOnInit() {
var container = document.getElementById('visualization');
// Create a DataSet (allows two way data-binding)
var items = new vis.DataSet([
{id: 1, content: 'item 1', start: '2013-04-20'},
{id: 2, content: 'item 2', start: '2013-04-14'},
{id: 3, content: 'item 3', start: '2013-04-18'},
{id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'},
{id: 5, content: 'item 5', start: '2013-04-25'},
{id: 6, content: 'item 6', start: '2013-04-27'}
]);
// Configuration for the Timeline
var options = {};
// Create a Timeline
var timeline = new vis.Timeline(container, items, options);
}
Veuillez trouver ci-dessous le code qui utilise angular2
avec vis
et il vous suffit d'installer vis
et de l'importer. Dans cet exemple, j'ai créé un composant angular2 pour la bibliothèque vis.
import { Component , OnInit, OnDestroy } from '@angular/core';
import { Network, DataSet, Node, Edge, IdType } from 'vis';
@Component({
selector: 'network-graph',
templateUrl: './network-graph.component.html'
})
export class NetworkGraphComponent implements OnInit{
public nodes: Node;
public edges: Edge;
public network : Network;
public ngOnInit(): void {
var nodes = new DataSet([
{id: 1, label: 'Node 1'},
{id: 2, label: 'Node 2'},
{id: 3, label: 'Node 3'},
{id: 4, label: 'Node 4'},
{id: 5, label: 'Node 5'}
]);
// create an array with edges
var edges = new DataSet([
{from: 1, to: 3},
{from: 1, to: 2},
{from: 2, to: 4},
{from: 2, to: 5},
{from: 3, to: 3}
]);
// create a network
var container = document.getElementById('mynetwork');
var data = {
nodes: nodes,
edges: edges
};
var options = {};
var network = new Network(container, data, options);
}
}
Utiliser des directives angulaires serait une approche propre pour résoudre ce problème. Commençons par installer vis.js
npm install vis
Le composant qui affiche le graphique vis devrait avoir un élément conteneur pour le graphique., Disons
graph-visualization.component.html
<div [appGraphVis]="graphData" class="graph-container"></div>
graph-visualization.component.css
.graph-container {
height: 25em;
widows: 100%;
}
graph-visualization.component.ts
import { Component, OnInit } from '@angular/core';
import { DataSet } from 'vis';
@Component({
selector: 'app-graph-visualization',
templateUrl: './graph-visualization.component.html',
styleUrls: ['./graph-visualization.component.css']
})
export class GraphVisualizationComponent {
graphData = {};
constructor() { }
ngAfterContentInit(){
// create an array with nodes
var nodes = new DataSet([
{id: 1, label: 'Node 1'},
{id: 2, label: 'Node 2'},
{id: 3, label: 'Node 3'},
{id: 4, label: 'Node 4'},
{id: 5, label: 'Node 5'}
]);
// create an array with edges
var edges = new DataSet([
{from: 1, to: 3},
{from: 1, to: 2},
{from: 2, to: 4},
{from: 2, to: 5}
]);
// provide the data in the vis format
this.graphData["nodes"] = nodes;
this.graphData["edges"] = edges;
}
}
Remarquez quelques petites choses:
graphvis.directive.ts
import { Directive, TemplateRef, ViewContainerRef, Input, Renderer2, ElementRef } from '@angular/core';
import { Network } from 'vis';
@Directive({
selector: '[appGraphVis]'
})
export class GraphVisDirective {
network;
constructor(private el: ElementRef) {}
@Input() set appGraphVis(graphData){
console.log('graph data ', graphData);
var options = {};
if(!this.network){
this.network = new Network(this.el.nativeElement, graphData, options);
}
}
}
Pour simplifier, j'ai gardé les options à l'intérieur de la directive. Dans le monde réel, les options seront passées comme une autre entrée de composant de haut niveau.
Des notes supplémentaires, nous pourrions ajouter les types de TypeScript pour vis pour aider lors du développement et le débogage. C'est disponible ici:
yarn add @types/vis -D
Si vous recherchez une solution prête à l'emploi, consultez cette bibliothèque - angular-vis . Au moment où j'écris ceci, il ne supporte pas toutes les fonctionnalités de vis.js
Eh bien, il faut apporter quelques modifications au code proposé ci-dessus, ce qui m'a pris du temps à contourner ... alors je les partage:
1) vous devez accéder au conteneur par @ViewChild ('netWords') netContainer: ElementRef; et #netWords dans la partie html.
2) vous devez accéder pleinement à l'élément conteneur à l'aide de la propriété nativeElement, ce qui donne this.network = new Vis.Network (this.netContainer.nativeElement, data, options);
Cela devrait fonctionner avec ces modifications.