gpt4 book ai didi

AngularJS : Transcluding SVG elements in directives

转载 作者:行者123 更新时间:2023-12-03 08:00:13 27 4
gpt4 key购买 nike

我对通过组合包裹在 Angular.js 指令中的可重用图形元素来构建复合 SVG 感兴趣。例如我可能有:

<div ng-app="svgApp">
<canvas>
<drawing ng-repeat="i in [1,2,3]" cy="{{i * 40}}"></drawing>
</canvas>
</div>

我在这里定义了以下指令:
  .directive('canvas', function () {
return {
template: '<svg height=200 width=100 ng-transclude></svg>',
restrict: 'E',
replace: true,
transclude: true
};
})

.directive('drawing', function () {
return {
template: '<circle cx=50 r=15></circle>',
restrict: 'E',
replace: true
};
})

问题是 SVG 元素似乎没有被正确嵌入。线索似乎是 here, in another StackOverflow question这主要是因为在 Angular.js 中没有正确创建 SVG 节点。

在进一步探索之后,我发现了 this solution, which involves using a helper function用正确创建的 SVG 节点替换相关的 DOM 元素,a la:
  .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;
});

然而,我需要在任何地方使用它似乎是不可取的,并且我希望尽可能将解决方法保持在错误的本地,直到它被修复。

我的问题是以下是否是一个合理的解决方法:
angular.forEach(['circle', ...], function (svgElem) {

svgModule

.directive(svgElem, function (createSVGNode) {
return {
restrict: 'E',
link: function(scope, element, attrs) {
var node = createSVGNode(svgElem, element, attrs);
angular.element(node).append(element[0].childNodes);
element.replaceWith(node);
}
};
});

});

这适用于 Plunker !

以这种方式重新定义现有的 SVG 元素指令对我来说是否有效?

最佳答案

如果您无法将代码移至 AngularJS 1.3 的事件开发提示,其中转换不同命名空间(例如 SVG 或 MathML)的元素的问题是 resolved,则上述方法是一种可能的方法。 .

已链接 Plunker演示如何使用修复程序更新您的代码。关键是在指令定义对象中添加了一个新的“templateNamespace”键:

  .directive('svgInternal', function () {
return {
templateNamespace: 'svg',
template: '<g><rect height="25" width="25" /><text x="30" y="20">Hello, World</text></g>',
restrict: 'E',
replace: true
};
})

以下标记演示了正在使用的 SVG-type 指令:
  <svg height="30">
<svg-internal></svg-internal>
</svg>

编辑 :自 1.3.beta.19 起,“type”已更改为“templateNamespace”。

关于AngularJS : Transcluding SVG elements in directives,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com