【问题标题】:Angular.js: using Directives in dynamic websiteAngular.js:在动态网站中使用指令
【发布时间】:2013-01-31 23:49:22
【问题描述】:

所以我正在动态构建一个表,大致是这样的

<tbody ng-repeat="d in data">
<td>{{d.name}}</td>
<td>{{d.dircleColor}}</td>   
<td id="a{{d.index}}>{{d.someOtherData}}</td>
...

“data”是一个数组,控制器中的$scope.data。基本的 Angular,效果很好。

现在,我还必须将 svg 元素 (D3.js) 添加到其中一个动态生成的

s

这些必须对应同样基于 $scope.data 的可视化,以便图表中的红色圆圈对应表格中的红色圆圈,并且用户知道在哪里查找信息。

我最大的希望是一个指令

.directive('dirCircle', function () {
   return function ($scope, elm, attrs) {                        
     var vis = d3.select(elm[0]).append("svg").attr("width", w).
        attr("height", h).attr("class", "circlesClass");
     node.append("svg:text")    [... more styling...]

这可行,但目前我不知道如何告诉指令,我的小 svg-circle 元素应该具有哪种颜色。此信息位于 $scope.data - 数组中。但是仅仅访问 $scope 是不够的。我需要绘制“当前”元素的信息。这可能吗?


如果这是不可能的,这里有一些可能的解决方法

1) 如果指令可以变得“具有自我意识”并环顾放置它的 DOM,那可能会有所帮助。注意在我上面的代码中我有&lt;td id="a{{d.index}}&gt;...

“a”就在那里,因为 id 以字母开头。 d.index 标识我的数组中的相关数据,所以如果我可以从我的指令中访问 $scope.data...?

2) 像往常一样生成 D3,但将其放入动态生成的表格单元格中,如下所示:

for (var i = 0; i < _data.length; i++) {
var svgContainer = d3.select("#a" + _data[i].index).append("svg")  //circleData[0].ci
            .attr("width", 20)
            .attr("height", 20)
            .attr("class", "circlesOnTheRight");

但是,“html-template”(ng-repeat/{{...}} - 东西)的“编译”总是在最后。如果将新元素添加到数组中,我的函数将始终在 angular 创建新的表格单元格之前触发。当我尝试它时,甚至 $scope.$on('includeContentLoaded', alert("..."));在 angular 完成之前触发。

【问题讨论】:

  • 我没有关注你。指令 dir-circle 应该放在哪里?

标签: javascript angularjs d3.js


【解决方案1】:

我不知道如何告诉指令,我的小 svg-circle 元素应该具有哪种颜色。此信息在 $scope.data

将颜色作为属性传递给将使用您的指令的同一元素(无论在哪里):

<some_element dir-circle the-color="d.color??"></some_element>

然后在你的指令中:

return function ($scope, elm, attrs) { 
   // $scope.$eval(attrs.theColor) contains your color

【讨论】:

  • 在您的代码中还包含 scope:{color:'@theColor'} 以从父作用域继承作用域
  • 谢谢。我刚刚使用 ($scope.$eval(attrs.theColor));掌握数据。仍然令人惊讶的是,“attr”实际上是指 DOM 中的“真实”属性。并且您可以首先制作自定义属性。魔法!
  • @Ajay beni:不能 100% 确定您的行将在我的代码中的位置以及它是如何工作的。我刚刚做了 ".directive('dirCircle', function () { return function ($scope, elm, attrs) { 后面跟着我已经拥有的代码。这不是restrict-replace-scope-template-kind指令。抱歉,我仍在努力更好地理解这一点!
  • @graph,我会推荐以下内容以了解有关范围继承和指令范围的更多信息:What are the nuances of prototypal scope inheritance?
  • @Ajay,使用scope:{...} 创建一个新的隔离范围,它 从父范围继承。此外,使用 @ 语法,需要使用 attrs.$observe() 来获取值(异步)。
猜你喜欢
  • 2014-03-17
  • 2013-11-23
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多