2015-09-08 4 views
1

Я видел как

$rootScope.$apply();

и

$rootScope.$digest();

который используется внутри завода. Однако Angular docs сказать:

Обычно вы не вызываете $ переваривать() непосредственно в контроллерах или в директив. Вместо этого вы должны вызвать $ apply() (обычно из директивы ), которая заставит $ digest().

Если вы хотите получать уведомление, когда вызывается $ digest(), вы можете зарегистрировать функцию watchExpression с $ watch() без прослушивателя.

В модульных тестах может потребоваться вызов $ digest() для имитации области действия жизненного цикла.

Одно из преимуществ не вызывать $digest заключается в том, чтобы избежать бесконечного цикла.

Есть ли случаи, когда следует использовать $digest по сравнению с $apply (помимо тестирования, как указано в цитате)?

ответ

5

Когда ваше приложение становится достаточно большим, чтобы дайджесты стали чрезмерно дорогими, вы можете вызвать дайджест в областях, которые, как вы уверены, не вызывают побочных эффектов для других частей вашего приложения.

Например, вы можете ввести плагин календаря jQuery, который вы обычно вызываете $ apply для наблюдения за привязками к области. Этот календарь может быть для формы обратной связи, поэтому он, так сказать, независим от остальной части вашего приложения, что может быть большой в реальном времени фидом данных, в которой тысячи наблюдателей.

Сфера применения. В вашем календаре будет проходить через ваше приложение и выполнять грязные проверки всех ваших тысяч наблюдателей для вашего канала в режиме реального времени, когда это не нужно. В этой ситуации вы должны вызывать $ scope. $ Digest(), потому что вы знаете, что изменилась только модель календаря.

+0

Это имеет смысл, спасибо. Не могли бы вы включить некоторые ресурсы, поддерживающие то, что вы говорите? –

+1

Источник: я, я угловатый разработчик, и я ресурс - основанный на моем опыте – sahbeewah

+0

lol, справедливо. –

2

Я думаю, что документация здесь бесполезна. Насколько я знаю:

  • $digest будет обрабатывать все наблюдатель на текущей области и ее ребенок.
  • $apply() более или менее обертка вокруг $rootScope.$digest и таким образом будет работать полный дайджест во всех областях.

В отличие от документа, вы можете использовать оба метода, чтобы вытащить обновление извне Угловое в цикл дайджеста. Как уже было сказано, $apply может вызывать полный цикл дайджеста, то есть $rootScope.$digest(). Вызов $digest вместо этого скорее всего предотвратит это и будет лучше для производительности.

Если вы хотите быть абсолютно уверены в том, что Angular распознает изменение, используйте $apply. Если вы знаете, что делаете, и вам нужно обновить текущую область (или ее детей), используйте $digest.

+1

Так что нет разницы в вызове '$ rootScope. $ Digest()' или '$ rootScope. $ Apply()'? –

+0

Небольшая, но очень важная разница. Отмечено смело в моем ответе. –

+0

Вы говорите, что вызов $ digest скорее всего предотвратит дайджест rootScope. При каких обстоятельствах вызов $ digest в дочерней области запускает корневой дайджест? – Sammi

Смежные вопросы