例如,我有自己的指令创建隔离范围:
angular.module("main", []).directive("makeIsolateScope", function () {
return {
scope: {
node: node
}
}
});
然后我将它与ng-repeat
一起使用,它创建了新的继承范围:
<li ng-repeat="node in nodes" make-isolate-scope="node">{{node.name}}</li>
元素li
的范围是什么?
答案 0 :(得分:2)
事实证明,该元素将有两个范围:
由ng-repeat指令
创建的子范围 angular.element(el).scope();
隔离makeIsolateScope
指令创建的范围:
angular.element(el).isolateScope();
订单如下:
1)调用ng-repeat
编译函数,优先级低于2000
(ng-repeat's
优先级)的所有其他指令不编译为编译节点的一部分。这意味着现在makeIsolateDirective
没有被编译。
2)由于ng-repeat
被定义为transclude:element
,整个节点被编译为转换编译过程的一部分,现在编译makeIsolateDirective
并执行其编译功能。
3)ng-repeat
执行链接功能,接收$ transcludeFn函数。此$transcludeFn
函数执行n
次,接收针对父节点的子范围(由转置机制创建)编译的克隆dom:
$transclude(function ngRepeatTransclude(clonedDom, scope) {
// here clonedDom is the clone of the original <li> node
4)makeIsolateBindings
的链接功能是使用此指令创建的隔离范围执行的。范围的父级是rootScope。
其他指令的链接功能(不创建隔离范围)使用子范围执行,该范围与$transcludeFn
链接功能中的ng-repeat
一起使用。
根据$$isolateBindings
的转换机制创建的子范围,对从父级创建隔离范围和请求ng-repeat
的指令进行评估。以下是源代码摘录:
forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) {
...
case '=':
...
lastValue = isolateBindingContext[scopeName] = parentGet(scope); // the scope here is the child's scope created by transclusion
This article对了解$transcludeFn
如何运作非常有用。
答案 1 :(得分:1)
每个指令都有priority
个数字,这是$compile
的指南。默认优先级编号为0,ng-repeat
为1000.因此,如果您将1001作为指令的优先级,则会提前编译,否则将提前编译ng-repeat。
答案 2 :(得分:0)
为了避免这些麻烦,只需将您的指令移到li
..