Иногда мне нужно использовать $scope.$apply
в своем коде, а иногда возникает ошибка «дайджест уже выполняется». Итак, я начал искать способ обойти это и нашел следующий вопрос: AngularJS: Предотвратить уже выполняющийся дайджест ошибки при вызове $ scope. $ Apply () . Однако в комментариях (и на вики-странице angular) вы можете прочитать:
Не делайте if (! $ Scope. $$ phase) $ scope. $ Apply (), это означает, что ваша $ scope. $ Apply () недостаточно высока в стеке вызовов.
Итак, теперь у меня есть два вопроса:
- Почему именно это антипаттерн?
- Как я могу безопасно использовать $ scope. $ Apply?
Другое "решение" для предотвращения ошибки "дайджест уже выполняется", похоже, использует $ timeout:
$timeout(function() {
//...
});
Это путь? Это безопаснее? Итак, вот настоящий вопрос: как я могу полностью исключить возможность ошибки «дайджест уже выполняется»?
PS: Я использую только $ scope. $ Apply в обратных вызовах, отличных от angularjs, которые не являются синхронными. (насколько я знаю, это ситуации, когда вы должны использовать $ scope. $ apply, если хотите, чтобы ваши изменения были применены)
scope
из angular изнутри или извне angular. Так что по этому вы всегда знаете, нужно вам звонитьscope.$apply
или нет. И если вы используете один и тот же код для угловых и неугловыхscope
манипуляций, вы делаете это неправильно, он всегда должен быть разделен ... поэтому в основном, если вы столкнетесь с ситуацией, когда вам нужно проверитьscope.$$phase
, ваш код не спроектирован правильно, и всегда есть способ сделать это «правильно»