Удаление и восстановление области действия цикла дайджеста

Есть ли способ удалить область из циклов дайджеста? Другими словами, чтобы приостановить/возобновить цикл дайджестов области?

В моем случае у меня есть все страницы, которые уже загружены, но не все из них видимы. Поэтому я хотел бы приостановить те, которые не видны, чтобы избежать ненужной обработки. Я не хочу использовать 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 может быть лучшим вариантом.