使用ng-repeat时如何获得元素的正确高度和偏移值?

时间:2014-12-22 03:53:05

标签: javascript angularjs angularjs-directive

我试图获取列表项的偏移量和高度。有了这些,我就在父指令上调用一个函数。 最后,当它们进入视图时,这将是过渡元素。

问题:由于ng-repeat(我不知道原因),el[0].offsetheightel[0].getBoundingClientRect().top;值几乎是随机的;除非,我在逻辑上包裹$timeout我认为这是因为样式有时间渲染?

问题:如何获得准确的偏移量和高度,无需包裹$timeout或使用$watch

HTML:

<dt  spyed ng-repeat="exp in experiences">
 ...
</dt>

JS:

app.directive('spyed', function () {
    return {
        require: '^scrollSpyer',
        link: function(scope, el, attrs, ctrl) {
            // this value is mostly random after the $first ng-repeat item
            var offset = el[0].getBoundingClientRect().top;
            // this value is also mostly randome after the $first ng-repeat item
            var theHeight = el[0].offsetHeight;
            // this fires the expMapper on parent directive.
            ctrl.expMapper(offset, theHeight);
        }
    };
});

关于为什么不使用观察者的旁注: 我不想使用观察者的原因是我在父指令中将这些值推送到集合中。我不想继续重置阵列,如果它在每次双向绑定上一直触发ctrl.expMapper(),我将不得不这样做。

家长指令:

app.directive('scrollSpyer', function ($window, Experiences) {
    return {
        controller: function($scope){
            $scope.experiences = [];
            this.expMapper = function(offset, height) {
                $scope.experiences.push({'offset': offset, 'height': height, 'inView': false});
            };
        },
        link: function(scope) {
            var i = 0;
            angular.element($window).bind('scroll', function() {

                if(i < scope.experiences.length) {
                    if (this.pageYOffset >= scope.experiences[i].offset) {
                        Experiences.status.push(scope.experiences[i]);
                        i++;
                    } else {
                        console.log('middle');
                    }
                }

                scope.$apply();
            });
        }
    };
});

1 个答案:

答案 0 :(得分:0)

在$ scope中使它成为一个函数:

$scope.getOffsets = function () {
    //Do your logic here
};

请注意这个小差异:

<dt  spyed ng-repeat="exp in experiences" ng-init="$last ? getOffsets(): ''">
    ...
</dt>

ng-init基于检查最后一个索引的条件将使该事件在没有超时的情况下发生