Angular 1.3 更新!
我在下面的原始答案充其量是一个巨大的黑客。你真正应该做的是更新到 Angular 1.3 并templateNamespace:'svg'
在你的指令中设置属性。下面以@Josef Pfleger 回答为例:在 Angularjs 指令中包含 SVG 模板
旧答案
如果将来有人遇到这种情况,我可以创建一个与 svg 模板一起使用的编译函数。它现在有点难看,因此非常感谢重构帮助。
现场示例:http : //plnkr.co/edit/DN2M3M?p=preview
app.service('svgService', function(){
var xmlns = "http://www.w3.org/2000/svg";
var compileNode = function(angularElement){
var rawElement = angularElement[0];
//new lines have no localName
if(!rawElement.localName){
var text = document.createTextNode(rawElement.wholeText);
return angular.element(text);
}
var replacement = document.createElementNS(xmlns,rawElement.localName);
var children = angularElement.children();
angular.forEach(children, function (value) {
var newChildNode = compileNode(angular.element(value));
replacement.appendChild(newChildNode[0]);
});
if(rawElement.localName === 'text'){
replacement.textContent = rawElement.innerText;
}
var attributes = rawElement.attributes;
for (var i = 0; i < attributes.length ; i++) {
replacement.setAttribute(attributes[i].name, attributes[i].value);
}
angularElement.replaceWith(replacement);
return angular.element(replacement);
};
this.compile = function(elem, attrs, transclude) {
compileNode(elem);
return function postLink(scope, elem,attrs,controller){
// console.log('link called');
};
}
})
用例:
app.directive('ngRectAndText', function(svgService) {
return {
restrict: 'E',
template:
'<g>'
+ '<rect x="140" y="150" width="25" height="25" fill="red"></rect>'
+ '<text x="140" y="150">Hi There</text>'
+ '</g>'
,
replace: true,
compile: svgService.compile
};
});