Я создал простую директиву, которая добавляет анимацию загрузки на основе javascript. Он работает с циклом window.setInterval()
. Это прекрасно работает, но когда загрузка завершена, я использую ngSwitch
для замены своего контента, что удаляет элемент, содержащий атрибут директивы загрузки, со страницы.
В идеале я хотел бы следить за этим изменением и очищать свой интервал, чтобы вычисления анимации не выполнялись в фоновом режиме. Я пробовал смотреть пользовательскую функцию, которая оценивает наличие элемента на странице. Я знаю, что функция работает при обнаружении этого, но кажется, что проблема заключается во времени, а именно, насколько я могу судить, сам $watch
очищается, когда элемент атрибута директивы покидает страницу. Поэтому мое выражение $watch
никогда не обнаруживает изменений и никогда не вызывает свой обратный вызов, очищающий функцию интервала анимации.
Есть ли рекомендуемая схема действий в подобных ситуациях?
Соответствующий фрагмент из моего шаблона:
<div ng-switch on="dataStatus">
<div ng-switch-when="loading">
<div loading-spinner></div>
</div>
<div ng-switch-when="haveData">
<!-- data dependent on content we were loading -->
</div>
</div>
Упрощенная версия моей директивы:
myModule.directive('loadingSpinner', function () {
var updateMySweetAnimation = function (element) { /* ... */ };
return {
link: function (scope, iElement, iAttrs) {
var spinner = window.setInterval(function () {
updateMySweetAnimation(iElement);
}, 100);
scope.$watch(function () {
return $(document).find(iElement).length;
}, function (present) {
if (!present) {
clearInterval(spinner);
}
});
}
};
});