Удаление и восстановление области действия цикла дайджеста
Есть ли способ удалить область из циклов дайджеста? Другими словами, чтобы приостановить/возобновить цикл дайджестов области?
В моем случае у меня есть все страницы, которые уже загружены, но не все из них видимы. Поэтому я хотел бы приостановить те, которые не видны, чтобы избежать ненужной обработки. Я не хочу использовать ng-view + $route
, мне не нужна/нужна глубокая привязка.
Я видел этот поток и прибыл в эту скрипку. Вероятно, он работает, но он довольно инвазивный и не очень дружелюбный к инфраструктуре.
Есть ли другое решение, подобное $scope.suspend()
и scope.resume()
? Или менее инвазивный (с каркасной точки зрения)? Я сейчас думаю о циклах $destroy
и $compile
.
Ответы
Ответ 1
Я столкнулся с той же проблемой, и я нашел интересное решение, которое не мешает (слишком много) для AngularJS. Добавьте это в области, которые вы хотите отключить:
var watchers;
scope.$on('suspend', function () {
watchers = scope.$$watchers;
scope.$$watchers = [];
});
scope.$on('resume', function () {
scope.$$watchers = watchers;
watchers = null;
});
Затем вы можете отключить область и ее дочерние элементы с помощью scope.$broadcast('suspend')
и вернуть ее с помощью scope.$broadcast('resume')
.
Ответ 2
В качестве основы сегодня нет способов приостановить/возобновить дайджест в области. Сказав это, существует несколько методов, которые можно использовать для ограничения количества часов, которые выполняются как часть цикла дайджеста.
Прежде всего, если части экрана скрыты, вы можете использовать ng-switch семейство директив, таким образом удаляя невидимые части полностью из DOM.
Во-вторых, если цикл digest запускается из вашей директивы через $apply
, и вы хотите ограничить переоценку часов для дочерних областей, вы можете вызвать $digest
вместо $apply
.
Тогда, да, можно было бы уничтожить и воссоздать области действия, как описано в обсуждении, с которым вы связались. Но, если вы уже скрываете части DOM, похоже, что ng-switch
может быть лучшим вариантом.