嵌套和重复angularjs指令中链接函数的调用顺序

嵌套和重复angularjs指令中链接函数的调用顺序,angularjs,angularjs-directive,angularjs-scope,angularjs-ng-repeat,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Ng Repeat,我对Javascript编程相当陌生,只接触过AngularJS。为了评估它,我决定写一个简单的note应用程序。该模型非常简单,是一个注释列表,其中每个注释都有一个标签、一个文本和一个标记列表。然而,我在嵌套指令的独立作用域之间传递数据时遇到了问题 我有三个指令,notes、note和tagger(用相同的名称定义新元素)。它们中的每一个都使用一个独立的作用域 notes指令使用ng repeat使用note元素“呈现”其每个注释 note指令使用tagger元素“呈现”标记列表 note指令

我对Javascript编程相当陌生,只接触过AngularJS。为了评估它,我决定写一个简单的note应用程序。该模型非常简单,是一个注释列表,其中每个注释都有一个标签、一个文本和一个标记列表。然而,我在嵌套指令的独立作用域之间传递数据时遇到了问题

我有三个指令,notes、note和tagger(用相同的名称定义新元素)。它们中的每一个都使用一个独立的作用域

notes指令使用ng repeat使用note元素“呈现”其每个注释

note指令使用tagger元素“呈现”标记列表

note指令定义作用域:{getNote:&“,…},以便将note实例从note列表传递给note控制器/指令。getNote(index)函数在note指令的link函数中调用。这个很好用

tagger指令定义作用域:{getTags:&“,…},以便将给定注释的标记列表传递给tagger控制器/指令。在tagger指令的link函数中调用getTags函数。这不行

据我所知,问题在于指令的链接函数的调用顺序不一致。调试应用程序表明,按以下顺序调用链接函数:

  • notes指令中的link函数 (将getNote函数添加到notes范围)

  • 第一个注释的tagger指令中的link函数 (在父注释作用域中调用getTags)函数

  • 第一个note指令中的link函数 (将getTags添加到范围) (在父notes范围内调用getNote)

  • 第二个注释的tagger指令中的link函数 (在父注释作用域中调用getTags)函数

  • 第二个note指令中的link函数 (将getTags添加到范围) (在父notes范围内调用getNote)

  • 这将不起作用,因为在#2中,第一个注释的范围还没有getTags函数

    一个简单的例子可以在中找到

    因此,我的问题归结为:什么决定了嵌套指令中调用链接函数的顺序

    (我在tagger指令中使用getTags上的$watch解决了这个问题…)


    就单个元素而言,链接函数的顺序由编译函数的顺序决定,而编译函数的顺序又根据指令定义对象的
    优先级
    属性进行排序

    资料来源:

    在具有转换的多个元素上:内部指令在外部指令之前求值。原因:转换的本质


    在具有同级的多个元素上:按从上到下的顺序执行。原因:解析$compile的逻辑

    引用Josh D.Miller的话,他友好地回答了我的一个类似问题:

    “只需几条技术说明。假设您有以下标记:

    <div directive1>
      <div directive2>
        <!-- ... -->
      </div>
    </div>
    
    
    
    现在AngularJS将通过按特定顺序运行指令函数来创建指令:

    指令1:编译

    指令2:编译

    指令1:控制器

    指示1:预链接

    指令2:控制器

    方向2:预链接

    方向2:发布链接

    方向1:发布链接


    默认情况下,一个直接的“链接”函数是一个post链接,因此在运行内部Direct2的链接函数之前,外部Direct1的链接函数不会运行。这就是为什么我们说在post链接中进行DOM操作是安全的。”

    Hi@basarat,感谢您花时间回答!然而,我没有把你的答案应用到我的问题上。我在同一个元素上没有多个指令。我不使用转换。我的笔记元素当然是兄弟姐妹,但我不知道你的意思。也许这很明显,但我仍然不理解我的Plunker示例中链接函数的调用顺序。感谢您的回答。也许我很愚蠢,但正如在我的plunker中看到的,我有:但是调用顺序的链接函数是。。。然而,根据你的回答,你会期待。。。抱歉,如果我太蠢了:-)我倾向于认为这是一个混合体,因为不仅ng repeat以优先级=1000执行(而且您有嵌套的ng repeat语句)。但是您似乎没有使用transclude选项,所以我不太确定嵌入指令的编译顺序。这是一篇非常全面的文章,介绍如何在嵌套指令上使用前链接/后链接。