У меня есть приложение Angular.js, которое выполняет большой набор расчетов типа учета (доход, затраты, прибыль и т.д.) по сложной объектной модели. Для изменения любой части объектной модели необходимо выполнить все вычисления. Кроме того, многие изменения в объектной модели могут быть сделаны непосредственно из моих шаблонов с использованием привязок - нет необходимости в промежуточном контроллере.
Многие из результатов расчета должны отображаться пользователю и вносить вклад в последующие вычисления. Например, доход отображается пользователю, но также используется для расчета прибыли (которая также отображается пользователю). Тем не менее, нет смысла вычислять доход в два раза (это сложный расчет) в каждом цикле дайджеста, поэтому очевидная оптимизация заключается в том, чтобы memoize, когда он сначала вычисляется, а затем повторно использует это memoized значение для продолжительности цикла.
Проблема в том, что мне нужно очистить эти мемуары либо в начале, либо в конце цикла дайджеста. Один из подходов состоял бы в том, чтобы контроллер мог перехватывать все возможные источники изменений и вручную обезличивать объектную модель, прежде чем приступать к вычислениям. Вместо этого я бы предпочел просто использовать привязки, которые были настроены.
Насколько я могу судить, мне нужен способ узнать, начинается ли цикл дайджест или когда он закончен. Когда я получаю это уведомление, я мог бы reset записать мемуары.
В документации Angular $ говорится:
Если вы хотите получать уведомления при вызове $digest, вы можете зарегистрируйте функцию watchExpression без прослушивателя. (Поскольку watchExpression может выполняться несколько раз за цикл $digest, когда изменение будет обнаружено, подготовиться к нескольким вызовам вашего слушателя.)
Это бесполезно для меня, потому что очистка мемуазов на каждой итерации цикла дайджеста приведет к поражению цели их использования в первую очередь. Мне нужно только одно уведомление за цикл дайджест.
Как я могу это сделать или есть альтернативный подход к решению проблемы?