6

从这个问题开始: 如何为 angularjs 编写一个指令,在不使用 ng-transclude 的情况下替换 dom 元素?

我希望编写一个指令来更改 dom 元素,然后保留所有属性和绑定。

<g:text x={{myX}} y={{myY}} font-size=10>Hello There</g:text>

<text x={{myX}} y={{myY}} font-size=10>Hello There</text>

提前致谢!

4

3 回答 3

8

据我所知,Angular 会自动将属性移植到新元素。无需自己遍历它们。

在您的情况下,如果您想保留内容,您还需要嵌入内容。

app.directive('myText', function() {
    return {
        replace: true,
        template: '<text ng-transclude></text>'
    }
});

这是我记忆中最深刻的,但我相信类似的事情会奏效。原元素的每一个属性都会被移植到新元素中,元素的内容也会被嵌入。绑定保存和所有。

于 2013-07-01T15:59:11.340 回答
6

在编译期间使用相同的逻辑并复制属性:

 app.directive('gText', function() {
    return {
        restrict: 'E',
        compile: function(tElement, tAttrs) {
            var attrs = tElement[0].attributes;
            tElement.replaceWith('<text>' + tElement.text() + '</text>');            
            for (var i=0; i < attrs.length; i++) {
                tElement.attr(attrs.item(i).nodeName, attrs.item(i).nodeValue);               
            }
        }
    }
});

小提琴:http: //jsfiddle.net/YWfSF/

于 2012-12-14T14:06:17.790 回答
0

(响应 Jason Swett 的更新请求)

这适用于 Angular 1.4.9(以及更早的概率)

return {
      restrict: 'E', // optional
      replace: true, // optional
      template: '<span data-ng-transclude></span>',
      transclude: true,
      link: function (scope, el, attrs) .........
}

关于这方面的一篇很棒的文章在...

https://www.accelebrate.com/blog/angularjs-transclusion-part-1/

于 2016-02-05T16:11:43.037 回答