2016-03-18 10 views
2

の要素からoffsetHeightを計算することはできません。要素がまだ内容を持っていないときに高さを計算しているからだと思います。は、私は次のディレクティブを持ってAngularJS

timeoutを使用せずにこの問題を解決するにはどうすればよいですか? この問題の解決策はありますか?

Plunkr

答えて

1

問題がng-repeatでレイジーにレンダリングし、リンク機能は、その前に解雇されます。この問題は、各ダイジェストサイクルでelem[0].offsetHeightの値を評価するwatcherという値で解決できます。したがって、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リピート要素の上に他のディレクティブを配置することができ、あること、一度イベントがレンダリングで完了$emitます&この場合、イベントリスナーinsideディレクティブがあり、そのイベントをリッスンして高さを計算します。

+0

ウォッチャーが一度変更を記録したら、そのウォッチャーを停止させる方法はありますか? – gespinha

+0

@GEspinhaはudpated答えを見てください –

+0

なぜ結果の中で関数を再実行していますか? – gespinha

関連する問題