AngularJS ディレクティブを使用してカスタム スクロール ペイン コンポーネントを実装しようとしています。次のjsfiddleの例では、基本的なプロトタイプの例を示しています。
ここに私の考えのスキーマがあります:
ディレクティブ コードは次のとおりです。
myApp.directive('lpScrollPane', function factory() {
return {
restrict: 'A',
replace: true,
transclude: true,
template: '<div class="scrollPaneWrapper"><div class="scrollPane" ng-transclude></div><div class="thumbTrack" ></div></div>',
compile: function (tElement, tAttrs) {
var minHeight = 30;
return function (scope, iElement, iAttrs) {
var thumbTrack = angular.element(iElement.children()[1]);
scope.onScrollHeight = function () {
console.log(iElement.children()[0].scrollHeight);
var H1 = iElement[0].offsetHeight;
var H2 = iElement.children()[0].scrollHeight;
if (H2 > H1) {
var trackHeight = Math.round(minHeight + (H1 - minHeight) * (1 - Math.pow((H2 - H1) / H2, 0.8)));
thumbTrack.css({
display: "block",
height: trackHeight + "px"
});
console.log(H2, H1, trackHeight);
} else {
thumbTrack.css({
display: "none"
});
}
};
scope.$watch(function () {
scope.onScrollHeight();
//setTimeout(scope.onScrollHeight, 100)
});
}
}
};
});
基本的に、オーバーフローが非表示の 2 つのダイブと、オーバーフロー スクロールのあるダイブ、サム トラッカーを模倣する別の div があります。
私の目標は、scrollHeight プロパティを監視し、それに応じてトラッカーの高さを変更することです。問題は、DOM がレンダリングされる前に $watch が起動されるため、トラッカーの表示と計算に遅延が生じることです。今のところ、watch 関数で setTimeout を使用しましたが、正常に動作します (35 行目のコメントを外し、34 行目のコメントを外して動作を確認してください)。
それを行う正しい方法は何ですか?