无法从 AngularJS 中的元素计算 offsetHeight
Can't calculate offsetHeight from an element in AngularJS
我有以下指令:
app.directive('myObject', function(){
return {
restrict: 'A',
link: function(scope, elem){
console.log(elem[0].offsetHeight);
}
};
});
这基本上是在记录其目标元素的 offsetHeight
,但它不起作用。我猜是因为它在元素还没有任何内容时计算高度。
如何在不使用 timeout
的情况下解决此问题?
这个问题有内置的解决方案吗?
问题是 ng-repeat
延迟渲染,link 函数在此之前被触发。您可以通过设置 watcher
来解决此问题,它将在每个摘要周期评估 elem[0].offsetHeight
值。因此,当 ng-repeat
完成渲染时,它会调用一个摘要循环,并且由于 elem[0].offsetHeight
值的变化,它会调用它的回调。
指令
var app = angular.module('plunker', []);
app.directive('myObject', function(){
return {
restrict: 'A',
link: function(scope, elem){
var calculateHeight = scope.$watch(function(){
return elem[0].offsetHeight;
}, function(newVal, oldVal){
//my awesome code here.
console.log(newVal, oldVal);
calculateHeight(); //de-registering watcher for performance reason
})
}
};
});
你可以做的其他替代方法是,你可以在 ng-repeat 元素上放置其他指令,一旦它完成渲染,它将 $emit
一个事件,然后我们将在指令中有事件监听器,它将监听输出该事件并计算高度。
我有以下指令:
app.directive('myObject', function(){
return {
restrict: 'A',
link: function(scope, elem){
console.log(elem[0].offsetHeight);
}
};
});
这基本上是在记录其目标元素的 offsetHeight
,但它不起作用。我猜是因为它在元素还没有任何内容时计算高度。
如何在不使用 timeout
的情况下解决此问题?
这个问题有内置的解决方案吗?
问题是 ng-repeat
延迟渲染,link 函数在此之前被触发。您可以通过设置 watcher
来解决此问题,它将在每个摘要周期评估 elem[0].offsetHeight
值。因此,当 ng-repeat
完成渲染时,它会调用一个摘要循环,并且由于 elem[0].offsetHeight
值的变化,它会调用它的回调。
指令
var app = angular.module('plunker', []);
app.directive('myObject', function(){
return {
restrict: 'A',
link: function(scope, elem){
var calculateHeight = scope.$watch(function(){
return elem[0].offsetHeight;
}, function(newVal, oldVal){
//my awesome code here.
console.log(newVal, oldVal);
calculateHeight(); //de-registering watcher for performance reason
})
}
};
});
你可以做的其他替代方法是,你可以在 ng-repeat 元素上放置其他指令,一旦它完成渲染,它将 $emit
一个事件,然后我们将在指令中有事件监听器,它将监听输出该事件并计算高度。