我试图获取列表项的偏移量和高度。有了这些,我就在父指令上调用一个函数。 最后,当它们进入视图时,这将是过渡元素。
问题:由于ng-repeat
(我不知道原因),el[0].offsetheight
和el[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();
});
}
};
});
答案 0 :(得分:0)
在$ scope中使它成为一个函数:
$scope.getOffsets = function () {
//Do your logic here
};
请注意这个小差异:
<dt spyed ng-repeat="exp in experiences" ng-init="$last ? getOffsets(): ''">
...
</dt>
ng-init基于检查最后一个索引的条件将使该事件在没有超时的情况下发生