AngularJS - 如何在指令渲染完成时查询DOM

Shl*_*rtz 2 javascript components widget web angularjs

我正在尝试使用AngularJS指令实现自定义滚动窗格组件.在下面的jsfiddle示例中,我有一个基本原型的示例.

这是我的想法的架构: 在此输入图像描述

这是指令代码:

    myApp.directive('lpScrollPane', function factory() {
    return {
        restrict: 'A',
        replace: true,
        transclude: true,
        template: '<div class="scrollPaneWrapper"><div class="scrollPane" ng-transclude></div><div class="thumbTrack" ></div></div>',
        compile: function (tElement, tAttrs) {
            var minHeight = 30;
            return function (scope, iElement, iAttrs) {
                var thumbTrack = angular.element(iElement.children()[1]);

                scope.onScrollHeight = function () {
                    console.log(iElement.children()[0].scrollHeight);

                    var H1 = iElement[0].offsetHeight;
                    var H2 = iElement.children()[0].scrollHeight;
                    if (H2 > H1) {
                        var trackHeight = Math.round(minHeight + (H1 - minHeight) * (1 - Math.pow((H2 - H1) / H2, 0.8)));
                        thumbTrack.css({
                            display: "block",
                            height: trackHeight + "px"
                        });
                        console.log(H2, H1, trackHeight);
                    } else {
                        thumbTrack.css({
                            display: "none"
                        });
                    }
                };

                scope.$watch(function () {
                    scope.onScrollHeight();
                    //setTimeout(scope.onScrollHeight, 100)
                });


            }
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

基本上有2次潜水1隐藏溢出,1次溢出滚动和另一个div模仿拇指跟踪器.

我的目标是监视scrollHeight属性,然后相应地更改跟踪器高度.问题是$ watch在呈现DOM之前被触发,因此显示和计算跟踪器有延迟.现在我在watch函数上使用了setTimeout,它运行正常(取消注释第35行和注释34以查看它的运行情况).

什么是正确的方法呢?

Mar*_*cok 5

看看Angular JS指令是否有一个post渲染回调?

不幸的是,没有办法确定渲染何时完成(例如,没有事件).使用$ timeout似乎是最好的解决方法.

在上面的链接中,@ Nik在评论中提到他正在检查$('tr').length > 3,以确定何时渲染完成.也许你可以在DOM中定期检查以确定渲染是否完整.