【发布时间】:2014-06-25 12:06:52
【问题描述】:
我想报告一起使用 angularjs 和 d3js 时的一个相当奇怪的行为。以下 plunker 说明了这一点:Plunker
这是完成大部分工作的指令:
.directive('element1', function() {
return {
restrict: 'E',
replace: true,
template: '<svg></svg>',
link: function (scope, element, attrs) {
var rootElmt = d3.select(element[0]);
rootElmt.append("g")
.selectAll("text")
.data(["Hello World"])
.enter()
.append("text")
.attr("x", 20)
.attr("y", 20)
.text(function(d) {
return d;
});
rootElmt.selectAll("text")[0]
.forEach(function(d) {
console.log("text length: ", d.getComputedTextLength());
});
}
}
});
您肯定会注意到,自定义元素指令 element1 仅根据获得的结果做了很多不必要的工作 - 实际上,我隔离了在一个更复杂的软件中出现的问题的核心,该设备位于在某种程度上需要。
plunker 产生预期的结果,即显示一个 SVG 文本字符串,并记录应用于后者的 getComputedTextLength() 的结果。 plunker使用angularjs v1.2.0rc3。
现在,如果您注释 1.2.0rc3 脚本加载子句,并取消注释 1.2.17(即相当新的版本)的注释,则代码会遇到错误,原因是 getComputedTextLength 未定义。
这个错误可以追溯到文本对象的属性:虽然旧版本的 Angular 提供了 SVGTextElement 对象(即来自 SVG 原型链),但新版本带来了 HTMLUnknownElement 对象 - 导致明显缺少 getComputedTextLength 方法。
这可能是 angularjs 和 d3 之间复杂交互的原因吗?也许我的指令代码不符合最近的 angularjs 最佳实践?
提前感谢您的热心帮助!
【问题讨论】:
标签: javascript angularjs svg d3.js