Javascript 将D3转换为AngularJs的正确方法

Javascript 将D3转换为AngularJs的正确方法,javascript,angularjs,d3.js,Javascript,Angularjs,D3.js,因此,我已经对D3做了很多实验,但从未尝试将其转换为AngularJS指令,我甚至不确定如何正确地改变它。我有一个例子,我相信我变成了一个角度D3图表,但我相信有更有效的方式加载数据,可能在$scope中。数据。。。请使用我的JSFIDLE进行参考或更正 您可以使用人们为使D3更易于在Angular中使用而制定的其他指令和服务(请参见问题注释),但我仍然喜欢在简单指令中轻松设置模块化图形: myApp.directive('graph', function() { var graphLin

因此,我已经对D3做了很多实验,但从未尝试将其转换为AngularJS指令,我甚至不确定如何正确地改变它。我有一个例子,我相信我变成了一个角度D3图表,但我相信有更有效的方式加载数据,可能在$scope中。数据。。。请使用我的JSFIDLE进行参考或更正


您可以使用人们为使D3更易于在Angular中使用而制定的其他指令和服务(请参见问题注释),但我仍然喜欢在简单指令中轻松设置模块化图形:

myApp.directive('graph', function() {
  var graphLink = function(scope, element) {
    var width = 960,
    height = 500;

   var color = d3.scale.category20();

   var force = d3.layout.force()
     .charge(-120)
     .linkDistance(30)
     .size([width, height]);

     var svg = d3.select(element[0]).append("svg") // attach d3 to directive element
       .attr("width", width)
       .attr("height", height);

     d3.json(data, function(error, graph) {
       if (error) throw error;

       force
         .nodes(graph.nodes)
         .links(graph.links)
         .start();

       var link = svg.selectAll(".link") // there might be a more angular way to do this...
         .data(graph.links)
         .enter().append("line")
         .attr("class", "link")
         .style("stroke-width", function(d) {
           return Math.sqrt(d.value);
         });

       var node = svg.selectAll(".node")
         .data(graph.nodes)
         .enter().append("circle")
         .attr("class", "node")
         .attr("r", 5)
         .style("fill", function(d) {
           return color(d.group);
         })
         .call(force.drag);

      node.append("title")
        .text(function(d) {
          return d.name;
        });

      force.on("tick", function() {
        link.attr("x1", function(d) {
          return d.source.x;
        })
          .attr("y1", function(d) {
            return d.source.y;
          })
          .attr("x2", function(d) {
            return d.target.x;
          })
          .attr("y2", function(d) {
            return d.target.y;
          });

        node.attr("cx", function(d) {
          return d.x;
        })
        .attr("cy", function(d) {
          return d.y;
        });
      });
    };

  return {
    link: graphLink, // pass in your link function here
    scope: {
      data: '=' // pass in your data as an attribute
                // this makes this reusable, and you can redraw if the data changes
    }
  };
});

你对使用ng3d开放吗?它是一个位于d3之上的包装器,它公开了一些API以使其不那么冗长?让我感觉到与angular指令的集成是很好的。所以我正在构建一个力方向图,另一个主要原因是我可以进行单元测试。你介意把它放在一个JSFIDE中,用一些数据来显示你的意思吗。@user2402107-这是我通过谷歌搜索找到的一个例子:这是angularjs的一个很好的例子,而d3则不是回答节点和链接的力有向图问题。。。很难用这个例子来说明你的意思……而且在使用了上面的答案之后,它甚至不能正常运行,并且有几个错误,即使在修复它们之后,它也不会做任何事情
myApp.directive('graph', function() {
  var graphLink = function(scope, element) {
    var width = 960,
    height = 500;

   var color = d3.scale.category20();

   var force = d3.layout.force()
     .charge(-120)
     .linkDistance(30)
     .size([width, height]);

     var svg = d3.select(element[0]).append("svg") // attach d3 to directive element
       .attr("width", width)
       .attr("height", height);

     d3.json(data, function(error, graph) {
       if (error) throw error;

       force
         .nodes(graph.nodes)
         .links(graph.links)
         .start();

       var link = svg.selectAll(".link") // there might be a more angular way to do this...
         .data(graph.links)
         .enter().append("line")
         .attr("class", "link")
         .style("stroke-width", function(d) {
           return Math.sqrt(d.value);
         });

       var node = svg.selectAll(".node")
         .data(graph.nodes)
         .enter().append("circle")
         .attr("class", "node")
         .attr("r", 5)
         .style("fill", function(d) {
           return color(d.group);
         })
         .call(force.drag);

      node.append("title")
        .text(function(d) {
          return d.name;
        });

      force.on("tick", function() {
        link.attr("x1", function(d) {
          return d.source.x;
        })
          .attr("y1", function(d) {
            return d.source.y;
          })
          .attr("x2", function(d) {
            return d.target.x;
          })
          .attr("y2", function(d) {
            return d.target.y;
          });

        node.attr("cx", function(d) {
          return d.x;
        })
        .attr("cy", function(d) {
          return d.y;
        });
      });
    };

  return {
    link: graphLink, // pass in your link function here
    scope: {
      data: '=' // pass in your data as an attribute
                // this makes this reusable, and you can redraw if the data changes
    }
  };
});