【发布时间】:2015-07-15 07:35:54
【问题描述】:
我正在尝试使用 Angular 指令创建 d3 图表。我设法创建了它,但问题是我想要图表元素上的一些 ng-click 事件,我不确定应该如何完成。
这是我的指令:
.directive('circleChart', function($parse, $window, $compile) {
return {
restrict: 'A',
scope: {
datajson: '='
},
link: function(scope, elem, attrs) {
var circleChart = new CircleChart(scope.datajson);
circleChart.initialise(scope);
var svg = circleChart.generateGraph();
svg = angular.element(svg);
console.log(svg);
//scope.$apply(function() {
var content = $compile(svg)(scope);
elem.append(content);
//});
}
}
});
CircleChart 对象创建了我的 d3 图表,并且我在图表元素上附加了一个 ng-click 属性(这似乎不是正确的 Angular 方法):
var CircleChart = Class.create({
initialise: function(scope) {
this.datajson = scope.datajson;
},
generateGraph: function() {
.............
var chartContent = d3.select("div#chart-content");
var svg = chartContent.append("svg")
.attr("id", "circle")
.attr("width", diameter)
.attr("height", diameter)
.style("border-radius", "50px")
.append("g")
.attr("transform", "translate(" + diameter / 2 + "," + diameter / 2 + ")");
...............
var circle = svg.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("class", function(d) {
return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root";
})
.attr("id", function(d) {
return d.id;
})
.attr("value", function(d) {
return d.name
})
.attr("parent", function(d) {
if (d.parent) return d.parent['id']
})
.attr("ng-click", function(d) {
return "getEgs('" + d.id + "')";
})
...............
d3 代码工作正常,因为如果我从指令中删除编译代码,图表会被绘制,但不会触发 ng-click。
如果我将编译代码留在那里,它会进入一个无限循环,并且浏览器正在建立内存,直到我不得不杀死它。
显然,我的方法不起作用,如果有人可以帮助我,那就太棒了
【问题讨论】:
-
generateGraph函数中的svg是什么?那是分离的DOM吗?另外,在我看来,从代码生成角度模板并不是一个好主意。我这样做的方法是在初始化或调用期间将回调传递给CircleChart,在 d3 中捕获点击事件并通过 Javascript 代码调用该回调。 -
@musically_ut 我用 svg 创建代码更新了我的问题。我试图理解你所说的关于传递回调的内容。你指的是我想用 ng-click 调用的实际函数吗?如果我在指令中使用控制器的范围,我可能可以访问它。
-
是的,我宁愿你在
.on('click', ...)中调用函数getEgs,而不是在代码中输出ng-click。
标签: javascript angularjs d3.js