无法从 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 的情况下解决此问题? 这个问题有内置的解决方案吗?

Plunkr

问题是 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
      })
    }
  };
});

Demo Here


你可以做的其他替代方法是,你可以在 ng-repeat 元素上放置其他指令,一旦它完成渲染,它将 $emit 一个事件,然后我们将在指令中有事件监听器,它将监听输出该事件并计算高度。