生成的 SVG 元素的动态 AngularJs 指令
Dynamic AngularJs directive by generated SVG element
我有一个带有 AngularJs 指令的 HTML 标签,例如:
<div line-chart></div>
它调用生成 SVG 对象及其相关子元素的指令。用于创建子元素的函数:
function drawDataPoints(params){
function drawDataPointCircles() {
var dataPointAttributes = {
'class': 'data-point negative'
};
params.svg.selectAll('circle data-point')
.enter()
.append('circle')
.attr('label-visible', '');
}
drawDataPointCircles();
}
该指令的输出是:
<svg class="chart">
<g>
<circle class="data-point negative" label-visible=""></circle>
</g>
</svg>
正如您可能注意到的那样,有一个 label-visible
应该调用波纹管指令:
angular.module('myApp')
.directive('labelVisible', function () {
debugger;
return {
restrict: 'A',
link: function(scope, element){
}
};
});
但不幸的是,labelVisible
指令已执行,但 link
函数从未被调用。有谁知道生成svg元素时如何调用labelVisible
?
感谢@Ethan Jewett 提示使用 $compile
服务。
问题终于解决了。问题在于,在渲染 SVG 元素时,它被渲染为普通字符串并且未绑定到 DOM。因此该指令永远不会被调用。所以,我需要做的是按照@Ethan 的建议,为每个生成的元素调用一个 $compile 函数,它会起作用,例如:
var point = params.svg.selectAll('circle data-point')
.enter()
.append('circle')
.attr('label-visible', '');
$compile(point[0])(scope);
我有一个带有 AngularJs 指令的 HTML 标签,例如:
<div line-chart></div>
它调用生成 SVG 对象及其相关子元素的指令。用于创建子元素的函数:
function drawDataPoints(params){
function drawDataPointCircles() {
var dataPointAttributes = {
'class': 'data-point negative'
};
params.svg.selectAll('circle data-point')
.enter()
.append('circle')
.attr('label-visible', '');
}
drawDataPointCircles();
}
该指令的输出是:
<svg class="chart">
<g>
<circle class="data-point negative" label-visible=""></circle>
</g>
</svg>
正如您可能注意到的那样,有一个 label-visible
应该调用波纹管指令:
angular.module('myApp')
.directive('labelVisible', function () {
debugger;
return {
restrict: 'A',
link: function(scope, element){
}
};
});
但不幸的是,labelVisible
指令已执行,但 link
函数从未被调用。有谁知道生成svg元素时如何调用labelVisible
?
感谢@Ethan Jewett 提示使用 $compile
服务。
问题终于解决了。问题在于,在渲染 SVG 元素时,它被渲染为普通字符串并且未绑定到 DOM。因此该指令永远不会被调用。所以,我需要做的是按照@Ethan 的建议,为每个生成的元素调用一个 $compile 函数,它会起作用,例如:
var point = params.svg.selectAll('circle data-point')
.enter()
.append('circle')
.attr('label-visible', '');
$compile(point[0])(scope);