在幕后,AngularJS 使用 JQuery 或 JQLite 从模板创建要替换的元素。
JQuery 和 JQLite 都使用具有正确 SVG 命名空间的 document.createElement 而不是 document.createElementNS。
在您的指令中,您需要从 AngularJS 接管 SVG 元素的创建。
您可以将以下辅助函数注入到您的指令中:
.value('createSVGNode', function(name, element, settings) {
var namespace = 'http://www.w3.org/2000/svg';
var node = document.createElementNS(namespace, name);
for (var attribute in settings) {
var value = settings[attribute];
if (value !== null && !attribute.match(/\$/) && (typeof value !== 'string' || value !== '')) {
node.setAttribute(attribute, value);
}
}
return node;
})
并在链接函数中使用它,而不是使用模板(外部或内联) - 例如:
link: function(scope, element, attrs) {
var cx = '{{x}';
var cy = '{{y}}';
var r = '{{r}}';
var circle = createSVGNode('circle', element, attrs);
angular.element(circle).attr('ng-attr-cx', cx);
angular.element(circle).attr('ng-attr-cy', cy);
angular.element(circle).attr('ng-attr-r', r);
element.replaceWith(circle);
$compile(circle)(scope);
}
您可以在https://github.com/mjgodfrey83/angular-piechart/上查看此工作的示例 - 在饼图上下文中。
Angular 1.3.0-beta8 中的修复程序允许指定非 html 指令模板类型 - 请参见此处。有关使用它的示例,请查看angular-charts。
希望有帮助。