1

皆さん、私は次の苦境に陥っています。

私は、別の ng-repeat と別の ng-repeat などを含む ng-repeat を持っています (バイナリ ツリー構造に似たものを作成しますが、複数のルートがあります)。問題は、データが適切な構造に挿入され、一部の構造が非常に大きいため、ダイジェストが実際に画面にすべてを表示するのを待っていることです。ダイジェストが構造の最後の要素のレンダリングを終了したことをどのように知ることができますか? 以下を ng-repeates に追加しましたが、ng-repeats も ng-repeated になる可能性があるため、何度も実行されます...テンプレートが読み込まれるたびにではなく、最後のテンプレートが読み込まれたときにのみ通知するにはどうすればよいですか? ng-repeat が終了したときに別のスレッド Calling a functionのおかげで私が持っているものは次のとおりです。

app.directive('onFinishRender', function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function () {
                    scope.$emit('ngRepeatFinished');
                });
            }
        }
    }
});


app.directive('onFinishRender', function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function () {
                    scope.$emit('ngRepeatFinished');
                });
            }
        }
    }
});

問題は、これが最後の ng-repeat に対して発生することですが、ネストされた ng-repeat の最後の終了がいつ終了したかを判断できないことです.ダイジェストがすべてのテンプレートとネストされたテンプレートのレンダリングを終了したことを検出する方法はありますか?

4

1 に答える 1

0

$scope.$last通常、これは特定の繰り返しを監視することで処理されます。

ただし、ランタイム実行時に大量のデータをロードしている場合は、おそらく Angular$postDigestが役に立ちます!

PS この場合は使用しないでください$emit。ディレクティブは、任意のコントローラーで必要な任意のスコープにリンクし、それらの値を変更できること、および絶対に必要でない限り$emit、 orを使用すること$broadcast常に避ける必要があることを忘れないでください。

app.directive('resolveApplication', function($timeout) {
    return {
        restrict:'A',
        link: function (scope) {
            // start by waiting for digests to finish
            scope.$$postDigest(function() {
                // next we wait for the dom to be ready
                angular.element(document).ready(function () {
                    // finally we apply a timeout with a value
                    // of 0 ms to allow any lingering js threads
                    // to catch up
                    $timeout(function() {
                        // your dom is ready and rendered
                        // if you have an ng-show wrapper 
                        // hiding your view from the ugly 
                        // render cycle, we can go ahead 
                        // and unveil that now:
                        scope.ngRepeatFinished = true;
                    },0)
                });
            });
        }
    } 
});
于 2016-03-21T21:02:50.133 に答える