Javascript Can';t从AngularJS中的一个元素计算远视

Javascript Can';t从AngularJS中的一个元素计算远视,javascript,angularjs,angularjs-ng-repeat,ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,Ng Repeat,我有以下指令: app.directive('myObject', function(){ return { restrict: 'A', link: function(scope, elem){ console.log(elem[0].offsetHeight); } }; }); 它基本上是记录其目标元素的远视,但它不工作。我猜这是因为它在计算元素还没有任何内容时的高度 如何在不使用超时的情况下解决此问题? 这个问题有没有内置的解决方案 问题是n

我有以下指令:

app.directive('myObject', function(){
  return {
    restrict: 'A',
    link: function(scope, elem){
      console.log(elem[0].offsetHeight);
    }
  };
});
它基本上是记录其目标元素的远视,但它不工作。我猜这是因为它在计算元素还没有任何内容时的高度

如何在不使用
超时的情况下解决此问题?
这个问题有没有内置的解决方案


问题是
ng repeat
延迟渲染,链接函数在此之前被触发。您可以通过使用
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
一个事件,一旦它完成渲染,那么我们将在该指令内设置事件侦听器,它将监听该事件并计算高度。

我如何让观察者在记录了一个更改后停止?@GEspinha请查看udated答案为什么要在结果中重新运行该函数?@GEspinha,即注销观察者。。基本上,它将从
$$watchers
object@GEspinha调用watcher函数本身将告诉angular从
$$watchers
(此处提供所有观察者)对象中删除当前已注册的观察者对象,请向上投票。:-)干杯