Ответ 1
Существует несколько способов регистрации обратного вызова после завершения дайджест.
Использование $$postDigest
:
$scope.$$postDigest
запускает обратный вызов после завершения текущего цикла $digest
.
Однако это выполняется только один раз после следующего цикла дайджест. Чтобы запустить его после каждого цикла дайджест, запустите его вместе с $watch
. Это основано на примере кода здесь.
var hasRegistered = false;
$scope.$watch(function() {
if (hasRegistered) return;
hasRegistered = true;
$scope.$$postDigest(function() {
hasRegistered = false;
fn();
});
});
$watch
может запускаться несколько раз во время цикла дайджеста, поэтому мы используем флаг hasRegistered
, чтобы предотвратить обратный вызов $$postDigest
для регистрации несколько раз.
Примечание: $$ postDigest не инициирует другой цикл дайджеста. Поэтому любая модификация $scope
внутри $$postDigest
не будет отображаться в dom. $$
означает, что это частная функция в angularjs, поэтому функция нестабильна и может измениться в будущем.
Использование $timeout
:
$timeout(function(){
console.log("Running after the digest cycle");
},0,false);
Это выполняется после завершения текущего цикла дайджеста. Примечание. Третий аргумент имеет значение false, чтобы предотвратить запуск другого цикла цикла.