Angular. Как узнать, когда содержимое переменной закончило отрисовку в DOM?
Приветствую.
Есть приложение на Angular.
С сервера получается текст, помещается в переменную $scope.variable и выводится на страничку {{variable}}
После вывода текста, срабатывает скрипт, который создает кастомную прокрутку. Для этого скрипта важна высота элемента, в который помещен текст.
Проблема в том, что текст с сервера может иметь разные размеры. От пары строчек текста до десятка печатных страниц.
Сейчас скрипт для прокрутки срабатывает по таймауту. Т.е получены данные с сервера, через 200mc вызывается скрипт прокрутки. Но из-за того, что текст может быть очень большой, этого времени не всегда хватает. Текст не успевает отрисоваться до конца, в результате высота контейнера с текстом неверная и результат получается неверный.
Можно ли как-то отследить конец отрисовки, чтобы сразу после этого вызвать скрипт для прокрутки?
P.S Вариант с увеличением времени таймаута не предлагать. Это не подходит.
Ну вообще, у вас неправильный подход . Вы пытаетесь писать в стиле JQuery. Вешаете watch на высоту вашего блока, и как только она меняется, двигаете страницу. Так как $watch отрабатывает при объявлении тоже, то первый раз у вас вызовется что-то типа "сделай скрол на 0px", но когда контент заполнится, $watch выполнится снова "сделай скрол на 200px". Вот похожая задача stackoverflow.com/questions/19048985/angularjs-bet...
На сколько это хорошо с точки зрения производительности? На сколько знаю, $watch вызывается при каждом обновлении $scope. А это значит, что watch будет вызываться кучу раз, что мне не надо. На странице может быть несколько панелей с прокруткой. Приложение достаточно большое, есть вложенность $scope, что в итоге даст почти постоянный вызов $watch.
Егор: Да, $watch вызывается при каждом $scope, но там есть нюансы. читайте про то как работают ивенты в скопе.
Так что, считаю, сначала стоит не парится и сделать так. Если будет проседать производительность то сделаете unwatch после того, как придет значение отличное от 0px . Если и это Вас не строит по производительности, будете крутить костыли с таймаутами.
Не совсем понимаю, при чем тут $digest цикл. Проблема то уже непосредственно в DOM. Когда переменная в $scope обновляется, то и элемент в DOM тоже обновляется. Если DOM элемент не успел до конца отрисоваться, а скрипт уже запустился, то высота получается меньше чем на самом деле.