0

我有一个指令,它返回带有 templateUrl 和链接属性的 DDO。我的 templateUrl 在 div 上包含 ngRepeat 指令,其中包含复选框元素。在我的链接函数中,我试图选择所有子复选框,但在调用我的链接函数时它们没有添加到 DOM 中。如果我将我的选择包装在 $timeout 中,当然会选中复选框。根据文档,Angular 按以下顺序调用函数:

mainDirective->compile->preLink->firstChildDirective->compile->preLink->lastChildDirective->compile->preLink->postLink->firstChildDirective->postLink->mainDirective->postLink。

根据 Angular 文档,如果您返回带有链接属性的 DDO,它被称为 postLink,在我看来,这意味着所有子复选框都应该已经在 DOM 中,但事实并非如此。

通过查看角度代码,我可以看到当你有编译函数但没有 templateUrl 时就是这种情况:

    if (directive.templateUrl) {
      assertNoDuplicate('template', templateDirective, directive, $compileNode);
      templateDirective = directive;
      nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i),
          nodeLinkFn, $compileNode, templateAttrs, jqCollection, directive.replace,
          childTranscludeFn);
      ii = directives.length;
    } else if (directive.compile) {
      try {
        linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
        if (isFunction(linkFn)) {
          addLinkFns(null, linkFn);
        } else if (linkFn) {
          addLinkFns(linkFn.pre, linkFn.post);
        }
      } catch (e) {
        $exceptionHandler(e, startingTag($compileNode));
      }
    }

此外,如果有链接属性,并且 templateUrl 的directive.compile 被分配了directive.link。

我清楚地可以看到 addLinkFns(null, linkFn) 在没有 templateUrl 时将链接函数绑定到 postLink 但是当你有带有一些子指令的 templateUrl 时会发生什么。为什么在调用链接功能时子复选框不可用?谢谢您的帮助!!!

4

1 回答 1

0

你忘了一件事:指令不必是静态的。他们可以对模型的变化做出反应。就是ng-repeat这样。评估模型时创建/删除元素。例如,可以在运行时添加项目,那么当你的指令被链接时,复选框就不可能在 DOM 中,显然。

于 2014-01-11T15:34:50.497 回答