Zoomable network graph in AngularJS

前端 未结 4 1979
醉话见心
醉话见心 2021-01-30 04:41

I would like to visualize a network graph in an AngularJS application. The nodes and edges are stored as a JSON object, and nodes will be added and modified later on (say once e

4条回答
  •  臣服心动
    2021-01-30 04:54

    I've been experimenting in VisJs in angular, and I'm really liking it so far. Their network is both pannable and zoomable, and you can select nodes. The documentation has been easy to follow and there are a lot of examples on their site. Since vis's networks can dynamically update, I found it easy to integrate it in my angular app. For example, I created this directive:

    app.directive('visNetwork', function() {
        return {
            restrict: 'E',
            require: '^ngModel',
            scope: {
                ngModel: '=',
                onSelect: '&',
                options: '='
            },
            link: function($scope, $element, $attrs, ngModel) {
                var network = new vis.Network($element[0], $scope.ngModel, $scope.options || {});
    
                var onSelect = $scope.onSelect() || function(prop) {};
                network.on('select', function(properties) {
                    onSelect(properties);
                });
    
            }
    
        }
    });
    

    Which I use in my html like so:

    
    
    

    Then in my controller I have the following:

        $scope.nodes = new vis.DataSet();
        $scope.edges = new vis.DataSet();
        $scope.network_data = {
            nodes: $scope.nodes,
            edges: $scope.edges
        };
        $scope.network_options = {
            hierarchicalLayout: {
                direction: "UD"
            }
    
        };
    
       $scope.onNodeSelect = function(properties) {
            var selected = $scope.task_nodes.get(properties.nodes[0]);
            console.log(selected);
        };
    
        $scope.nodes.add([
            {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'}]);
    
        $scope.edges.add([
            {id: 1, from: 1, to: 2},
            {id: 2, from: 3, to: 2}
        ]);
    

提交回复
热议问题