两个指令创建新的继承的和隔离的作用域-元素得到哪个
two directives creating new inherited and isolated scope - which one does the element get
例如,我有自己的指令来创建隔离范围:
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
的作用域是什么?
事实证明,元素将有两个作用域:
-
ng重复指令创建的子作用域
angular.element(el).scope();
-
隔离
makeIsolateScope
指令创建的作用域:angular.element(el).isolateScope();
订单如下:
1) 调用ng-repeat
的编译函数,并且不将优先级低于2000
(ng-repeat's
优先级)的所有其他指令作为编译节点的一部分进行编译。这意味着现在makeIsolateDirective
没有被编译。
2) 由于ng-repeat
被定义为transclude:element
,整个节点被编译为transclusion编译过程的一部分,现在makeIsolateDirective
被编译并执行其编译功能。
3) 执行ng-repeat
的链接函数,接收$transcludeFn函数。此$transcludeFn
函数执行n
次,接收针对父节点的子作用域(由transclusion机制创建)编译的克隆dom:
$transclude(function ngRepeatTransclude(clonedDom, scope) {
// here clonedDom is the clone of the original <li> node
4) makeIsolateBindings
的链接函数是在由该指令创建的独立作用域中执行的。作用域的父级是rootScope。
不创建隔离作用域的其他指令的链接函数使用子作用域执行,该子作用域在ng-repeat
的链接函数中与$transcludeFn
一起使用。
创建隔离作用域并从父级请求$$isolateBindings
的指令是根据ng-repeat
的transclusion机制创建的子作用域进行评估的。以下是源代码摘录:
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
这篇文章对理解$transcludeFn
的工作原理非常有用。
每个指令都有一个priority
编号,它是$compile
的指导。默认优先级编号为0,ng-repeat
为1000。因此,如果你把1001作为指令的优先级,它将提前编译,否则ng repeat将提前编译。
为了避免这些麻烦,只需将指令移动到li
中即可。。
- 从控制器继承了隔离的作用域以生成可重用的指令
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- AngularJS指令隔离作用域
- 访问多个指令的隔离作用域
- 如何在隔离作用域指令中访问此作用域变量
- AngularJs,在没有隔离的情况下将指令属性添加到作用域
- AngularJS:ngRepeat作用域在具有隔离作用域和ngTransclude的自定义指令中失败
- 将回调绑定到没有隔离作用域的指令
- 在不使用隔离作用域的情况下执行函数的角度指令
- 隔离作用域+绑定名称和仅在AngularJS中的隔离作用域之间的差异
- ng隔离未附加到templateUrl的作用域
- 角度:覆盖'@'链接或控制器中隔离作用域中的属性
- 隔离未更新指令中值的作用域
- 使用隔离作用域的角度指令
- 在AngularJS中对指令的隔离作用域设置新属性
- 如何在使用ng repeat时停止传播(或者如何更好地隔离作用域)
- $scope变量在指令隔离作用域中未定义
- 无法从具有隔离作用域的指令中访问控制器中定义的对象
- 在指令的隔离作用域中定义的调用函数
- 试图在作用域隔离的指令中运行绑定方法