Javascript 以角度构建交互式d3力布局

Javascript 以角度构建交互式d3力布局,javascript,angularjs,d3.js,Javascript,Angularjs,D3.js,我试图建立一个网站使用angular和d3,而不是特别擅长与他们任何一个。我希望有一个具有很多功能的强制布局,这样我可以选择节点,让它们用信息填充一个侧栏,然后在侧栏中有选项来更新该节点/查找其邻居/等等 我遇到的是一团混乱,我一直在尝试从angular应用程序的各个部分访问d3模块时遇到问题,反之亦然。我目前有一个指令内的d3代码,但这使得从边栏控制器调用变得困难。以前我在服务中使用过它,但这使得d3很难访问force layout controller范围。我想用它来调用scope.$app

我试图建立一个网站使用angular和d3,而不是特别擅长与他们任何一个。我希望有一个具有很多功能的强制布局,这样我可以选择节点,让它们用信息填充一个侧栏,然后在侧栏中有选项来更新该节点/查找其邻居/等等

我遇到的是一团混乱,我一直在尝试从angular应用程序的各个部分访问d3模块时遇到问题,反之亦然。我目前有一个指令内的d3代码,但这使得从边栏控制器调用变得困难。以前我在服务中使用过它,但这使得d3很难访问force layout controller范围。我想用它来调用scope.$apply

以下各部分需要协同工作:

d3在不同svg对象上使用事件侦听器 强制布局元素控制器 边栏控制器 数据服务
我应该把东西放在哪里我应该使用什么样的模块,我应该从哪里调用什么?因此,我可以随时使用d3.init函数添加数据,但d3在围绕MVC原则进行开发的摸索尝试中也发挥了很好的作用?

以下答案基于我开发Angular/d3应用程序的经验;您可以查看源代码的最新版本

在angular中生成D3指令的第一个原则是,控制器将加载数据并使用属性将数据放置在指令上。该指令声明可能类似于:

<force-layout-chart data="force.data"></force-layout-chart>
响应将来自您的数据服务…类似于$http的内容:

$http.get('/api/v2/foo/bar').then(function(response){
  $scope.force = {
    data: response
  };
})
然后在指令中使用scope.$watch侦听对force.data的更改:

响应对象将是force.data中的数据。在返回指令中,您需要在数据属性上启用双向数据绑定:

 return {
   restrict: 'E',
   scope: {data: '='},  //two-way binding
   link: link
 }
angular文档描述了数据绑定的各种方法以及您可能使用它们的原因,但您几乎肯定需要=here

由于要使用多个控制器来控制此指令,因此应使用require属性

scope.$watch('data',function(response){
  if (!response) return;

  //Update your D3 here
});
 return {
   restrict: 'E',
   scope: {data: '='},  //two-way binding
   link: link
 }
return {
  restrict: 'E',
  scope: {data: '='},
  require: ['SideBarCtrl','ForceCtrl'],
  link: link
};