angular 指令链接函数在 DOM 操作中的奇怪优先级(在 ng-repeat 之后)

Weird precedence of angular directive linking function in DOM manipulation (after ng-repeat)

我对这个 angular 事物(和一般的 web-dev)是新手,但是我遇到了一个关于自定义指令的 angular link 函数如何运行的奇怪行为更改 DOM。更具体地说,该指令(使用 ng-repeat)创建了一个模板的多个实例:这些实例可以通过 document.getElementsByClassName() 以某种方式访问​​,但不能在 angular 或 jquery 中访问。

我的index.html和组-widgets.html(包含模板)同样是:

<div class="groups_panel">
    <group-widgets class="col-md-12" style="margin-top:60px;"></group-widgets>
</div>

<div class="col-md-6 comment" ng-repeat="group in gWidget.groups">
    <div ...</div>
</div>

我的 app.js 就像:

(function(){
    var app = angular.module('pm',[]);
    app.directive('groupWidgets',function(){
        return{
            restrict: 'E',
            templateUrl: 'group-widgets.html',
            controller:function($scope){
                this.groups = allGroups;
                console.log($scope);
                console.log("Wait till renders...");                
            },
            controllerAs: 'gWidget',
            link: function(scope, element, attributes, parentCtrl){
                console.log("LINKED!");
                console.log(document.getElementsByClassName("comment"));
                console.log(element.html());
                console.log($(".comment"));
                console.log("END");
            }
        };
    });
})();

allGroups 变量是一个数组,其元素 ng-repeat 实例化。 运行 使用 chrome 开发工具后,我得到: Screenshot(检查内部 LINKED!和 END)。

很明显,在 linking 函数期间,由 ng-repeat 创建的 DOM(屏幕截图中显示的四个实例)可用于 getElementsByClassName() 但在 [=34 中不可用=] 元素对象既不在整个 DOM using jQuery!

我已经解决了其他问题 (Calling a function when ng-repeat has finished.,AngularJS: Linking to elements in a directive that uses ng-repeat) 中描述的问题,但我无法理解指令 link 函数工作的顺序以及为什么会发生这种情况。显然我做错了什么。你能帮我澄清一下这个问题吗?

提前致谢。

这里发生的事情可能会让您感到困惑,因为 Chrome 控制台在 "view-time" 评估记录的对象,而不是 "log-time"。

简单的检查方法是执行以下操作:

 console.log(document.getElementsByClassName("comment").length); // will be 0

因此,您从 document.getElementsByClassName 获得的 HTMLCollection 会在您查看日志时进行评估,因此包含 4 个 div。



(*) 我不确定 "viewing" 的具体构成,或者实际触发器是什么,但它不是日志记录。