Javascript 创建新的继承和隔离作用域的两个指令-元素得到哪一个

Javascript 创建新的继承和隔离作用域的两个指令-元素得到哪一个,javascript,angularjs,Javascript,Angularjs,例如,我有自己的指令创建隔离范围: angular.module("main", []).directive("makeIsolateScope", function () { return { scope: { node: node } } }); <li ng-repeat="node in nodes" make-isolate-scope="node">{{node.name}}</li>

例如,我有自己的指令创建隔离范围:

angular.module("main", []).directive("makeIsolateScope", function () {
    return {
        scope: {
            node: node
        }
    }
});
<li ng-repeat="node in nodes" make-isolate-scope="node">{{node.name}}</li>
然后我将其与创建新继承范围的
ng repeat
一起使用:

angular.module("main", []).directive("makeIsolateScope", function () {
    return {
        scope: {
            node: node
        }
    }
});
<li ng-repeat="node in nodes" make-isolate-scope="node">{{node.name}}</li>
  • {{{node.name}

  • 元素
    li
    的作用域是什么?

    每个指令都有一个
    优先级
    编号,它是
    $compile
    的指南。默认优先级为0,
    ng repeat
    为1000。因此,如果您将1001作为指令的优先级,它将提前编译,否则ng repeat将提前编译。

    事实证明,元素将有两个作用域:

    • 由ng repeat指令创建的子作用域

      angular.element(el.scope()

    • 隔离由
      makeIsolateScope
      指令创建的范围:

      angular.element(el.isolateScope()

    顺序如下:

    1)
    ng repeat
    的编译函数被调用,优先级低于
    2000
    ng repeat的
    优先级)的所有其他指令都不会作为编译节点的一部分进行编译。这意味着现在未编译
    makeIsolateDirective

    2) 由于
    ng repeat
    被定义为
    transclude:element
    ,整个节点作为转换编译过程的一部分进行编译,现在编译
    makeIsolateDirective
    ,并执行其编译功能

    3) 执行ng repeat的链接函数,该函数接收$TRANCLUDEFN函数。此
    $transcludeFn
    函数在接收针对父节点的子作用域(由转换机制创建)编译的克隆dom时执行
    n
    次:

    $transclude(function ngRepeatTransclude(clonedDom, scope) {
        // here clonedDom is the clone of the original <li> node
    

    理解
    $transcludeFn
    的工作原理非常有用。

    为了避免这些麻烦,只需将指令移到
    li
    中即可。

    我认为第一个ng repeat会创建继承的作用域,然后在继承的作用域中为该指令创建另一个作用域。@Anita,请查看我的答案,如果你感兴趣,回答得很好。元素将在两个作用域中共享,但我想最后它是共享所依赖的优先级。我不这么认为,因为
    ng repeat
    的优先级高于我的自定义指令,并且它也被定义为
    terminal
    ,所以我的指令将作为
    转换过程的一部分进行编译。对不起,我不明白,这和这个问题有什么关系?具有最高优先级的指令的作用域是否用于元素?作用域在编译和链接DOM后链接到DOM。换句话说,稍后编译的一个将给出scopeWell,这在这里并不容易,我自己刚刚开始调查这件事
    ng repeat
    is确实比我的指令具有更高的优先级,但是,它被定义为
    terminal
    ,因此我的指令根本不会被编译。但是,
    ng repeat
    被定义为
    transclude:element
    ,它可能最终会编译我的指令,但我不知道现在该怎么做。让我再调查一下,我想我会找到我自己问题的答案。请看我的答案,如果你感兴趣的话,你真的把这个洞挖得很深,我喜欢它,并且为旧版本的信息感到抱歉