5

从另一个指令中添加指令,会使浏览器挂起。

我想做的是

<h7></h7>1)在 compile 函数中更改自定义元素指令(如)。通过这样做,浏览器挂起。

代码:

<h7>TEST</h7>
    animateAppModule.directive('h7', function($compile){
        return {
            restrict:"E",
            compile:function(tElement, tAttrs, transclude){                
                tElement[0].setAttribute("ng-class", "{selected:istrue}");
                return function(scope, iElement, iAttrs){
                    //$compile(iElement)(scope);
                }
            }
        }
    })

如果我取消注释此行//$compile(iElement)(scope);,浏览器将挂起。您可以取消注释此小提琴http://jsfiddle.net/NzgZz/3/中的上述行以查看浏览器挂起。

但是,如果我在指令中有模板属性,则不会发生浏览器挂起h7,如this fiddle所示。http://jsfiddle.net/KaGRt/1/

总的来说,我想要实现的是

我想在个人指令的帮助下使用新功能来修改模板。类似于装饰器模式。我在指令链中的指令的编译函数中执行此操作,以便它影响该模板的所有实例。

我正在努力实现的伪示例。

<xmastree addBaloon addSanta></xmastree>

1)说 xmastree 有一个模板 -<div class="xmastree" ng-class={blinks:isBlinking}></div>

2)说addBaloon有一个模板<div class="ballon" ng-class={inflated:isinflated}></div> 然后,addBaloon编译功能应该将模板从步骤1扩充到这样的东西

<div class="xmastree" ng-class={blinks:isBlinking}>
    <div ng-repeat = "ballon in ballons">
        <div class="ballon" ng-class={inflated:isinflated}></div>
    </div>
</div>

3)说addSanta有一个模板<div class="santa" ng-class={fat:isFat}></div> 然后,addSanta编译功能应该将模板从第2步扩充到这样的东西

<div class="xmastree" ng-class={blinks:isBlinking}>
    <div ng-repeat = "ballon in ballons">
        <div class="ballon" ng-class={inflated:isinflated}></div>
    </div>
    <div ng-repeat = "santa in santas">
        <div class="santa" ng-class={fat:isFat}></div>
    </div>
</div>

在所有编译之后,如果我针对具有合适属性的范围运行从 step3 派生的模板,我应该能够获得 HTML。

4

1 回答 1

3

调用$compile指令本身的元素将导致相同的指令再次运行,然后重复该过程 - 永远。在许多指令的 Angular 源代码中,您可以看到它们是这样处理这种情况的:$compile(element.contents())(scope);使用element.contents()而不是仅仅使用element(). 这意味着元素内部的所有内容都被编译并且指令/数据绑定被注册并且没有创建循环。

如果您确实需要$compile元素本身,请在编译之前完全替换原始元素或从中删除原始指令(删除属性、更改节点类型等)。

于 2013-12-06T07:47:07.187 回答