Я провел обширные исследования по этой теме, но независимо от того, что я делаю, мне очень сложно достичь этой цели.
Я хочу выполнить код, когда все элементы были полностью отображены в веб-приложении AngularJS. Я думаю, что нашел решение, предлагающее использовать маршрутизаторы и представления, но я не мог сделать эту работу над своим делом, поскольку, похоже, для этого требуется определенная конфигурация.
Когда у вас есть ng-repeat
и много вложенных directives
, которые будут генерировать HTML/Content на основе различных условий, используя ng-if
, я заметил, что рендеринг HTML продолжается даже после того, как событие готовности документа или просмотр содержимого был загружено событие $viewContentLoaded
.
Ближайшей идеей, которую я имею, является использование $watch
по длине дочерних элементов элемента данного directive
. Каждый раз, когда выполняется $watch
, увеличивайте счетчик renderCount
. Затем, в другом событии таймера, проверьте, не изменился ли счетчик renderCount
за прошлый период через 3-5 секунд, тогда мы можем сделать предположение, что рендеринг сделан.
Код для наблюдения за детьми и проверка того, не происходит ли более рендеринг, может быть следующим:
app.directive('whenRenderingDone', function($interval, $parse){
return {
link: function (scope, el, attrs) {
var renderingCount = 0;
function watchForChildren() {
scope.$watch(function(){
return $(':input', el).length;
}, function(newVal, oldVal){
if (newVal) {
renderingCount++;
}
})
}
watchForChildren();
//Check counter every 3 seconds, if no change since last time, this means rendering is done.
var checkRenderingDone = $interval(function(){
var lastCount = lastCount || -1;
if (lastCount === renderingCount) {
var func = $parse(attrs.whenRenderingDone);
$interval.cancel(checkRenderingDone);
func(scope);
}
lastCount = renderingCount || -1;
}, 3000);
}
}
});
Я попытаюсь реализовать вышеупомянутый подход, и если у вас есть обратная связь, пожалуйста, дайте мне знать.
Тарек