2015-11-23 58 views
2

是否有可能以某种方式在compile函数中添加指令作为简单属性并让角度句柄编译添加指令?AngularJS:添加属性,编译指令

提供的示例波纹管显然不起作用,但我的正确问题是,实现该目标的最简洁方法是什么?

var app = angular.module('app', []); 
 

 
app.directive('testOne', function ($compile) { 
 
    return { 
 
    restrict: 'A', 
 
    priority: 10000, 
 
    compile: function (element, attrs) { 
 
     
 
     element.attr('test-two', ''); 
 
    } 
 
    }; 
 
}); 
 

 
app.directive('testTwo', function() { 
 
    return { 
 
    restrict: 'A', 
 
    priority: 10, 
 
    compile: function (element, attrs) { 
 
     console.log(2); 
 
    } 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-app="app"> 
 

 

 
    <div test-one></div> 
 

 

 
</div>

回答

4

在链接阶段,你可以调用$compile(element)(scope)重新编译的元素,让AngularJS拿起新添加的指令。但是,为了防止无限循环(因为你最初的指令也将重新编译),你应该首先删除初始指令的属性:

link: function (scope, element) { 
    element.removeAttr('test-one'); 
    element.attr('test-two', ''); 

    $compile(element)(scope); 
} 

编辑:您可能还需要设置terminal: true您的初始指令来防止其他指令在属性按摩完成之前踢入。出于类似的原因,您可能还必须考虑指令的优先级。

+0

好,所以这是最干净的方式:)我想知道如果我能以某种方式避免多个编译。谢谢! – Clem

+0

另一个问题,如果你知道答案也许。我如何以编程方式更改元素的属性,以便另一个指令中的$ observe会触发?我尝试了attrs。$ set并且没有运气。 – Clem

+0

如果指令没有主动监视属性表达式的更改,那么您运气不好。我会偷看到其他指令的源代码(如果它不是你的指令),看看是否有任何看着。 –