2015-03-17 5 views

risposta

48

Ci sono un paio di modi per registrare un callback una volta completato il digest.

Utilizzando $$postDigest: $scope.$$postDigest incendi una richiamata dopo che la corrente $digest ciclo completato.

Tuttavia, questa operazione viene eseguita solo una volta dopo il successivo ciclo di digestione. Per eseguirlo dopo ogni ciclo di digest eseguilo insieme a $watch. Questo è basato sul codice di esempio given here

var hasRegistered = false; 
$scope.$watch(function() { 
    if (hasRegistered) return; 
    hasRegistered = true; 
    $scope.$$postDigest(function() { 
    hasRegistered = false; 
    fn(); 
    }); 
}); 

Il $watch può ottenere innescato più volte nel corso di un ciclo di digerire in modo da utilizzare una bandiera hasRegistered per evitare $$postDigest richiamata da registrare più volte. Nota: $$ postDigest non attiverà un altro ciclo di digestione. Quindi qualsiasi modifica apportata a $scope all'interno di $$postDigest non verrà visualizzata nella dom. $$ significa che questa è una funzione privata in angularjs, quindi la funzione non è stabile e potrebbe cambiare in futuro.

Utilizzando $timeout:

$timeout(function(){ 
console.log("Running after the digest cycle"); 
},0,false); 

Questo viene eseguito dopo che la corrente digest ciclo è completo. Nota: il terzo argomento è impostato su false per impedire un altro trigger del ciclo digest.

+0

puoi passare attraverso questa domanda http://stackoverflow.com/questions/29002977/why-ng-model-value-not-updating-in-scope-variable –

+0

L'approccio $ timeout ha funzionato come un incantesimo! –