内部では、AngularJS は JQuery または JQLite を使用してテンプレートから要素を作成し、置き換えます。
JQuery と JQLite は両方とも、正しい SVG 名前空間で document.createElementNS ではなく document.createElement を使用します。
ディレクティブでは、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/で、円グラフのコンテキストでこの動作の例を見ることができます。
非 html ディレクティブ テンプレート タイプを指定できるようにする修正が angular 1.3.0-beta8 に上陸しました -こちらを参照してください。使用例については、angular-chartsを確認してください。
それが役立つことを願っています。