2012-09-20 13 views
16

Quando aggiorno direttamente il valore dell'ambito, esso si aggiorna correttamente nella vista, ma quando questo valore viene aggiornato dal callback AJAX non viene aggiornato. Ecco un esempio semplificato - http://jsfiddle.net/hS8Bs/1/AngularJS valore di aggiornamento da callback AJAX

Come posso aggirarlo?

Aggiornamento: Ho notato che facendo clic due volte sul collegamento si aggiorna il valore, ma non è quello che sto cercando.

+0

http://jsfiddle.net/hS8Bs/3/ Questa è anche una possibile soluzione. Ma l'altra soluzione menzionata di seguito che usa $ http è il modo giusto per farlo. – ganaraj

risposta

41

Il vero problema è la mancanza di $scope.$apply. Quando si aggiorna il modello angolare al di fuori del digest angolare dovresti usare apply.

$.getJSON('/echo/json/', {}, function(data){ 
    $scope.$apply(function(){ 
     $scope.period = '2010 - 2011'; 
    }); 
});  

Questo attiverà la diggest di vedere l'aggiornamento e se il codice all'interno di applicare un'eccezione verrà reindirizzato al servizio $exceptionHandler.

+0

Grazie, per me è stato risolto! – arnaslu

+0

'$ scope. $ Apply' è esattamente quello che stavo cercando, grazie! – GameScripting

+0

Grazie, funziona davvero come per magia! Tu salvi la mia giornata! – wagyaoo

5

Questo è un addon alla risposta selezionata, ho trovato che Angular JS ha ancora chiamato "Errore: $ digest già in corso" quando ho implementato la funzione $ apply().

Così ho trovato Will Vincent's codice su questo post: AngularJS : What's the Angular way to interact with a form? , controlla a $ digerire già in corso e solo le chiamate si applicano $() quando sicuro di:

$scope.safeApply = function(fn) { 
    var phase = this.$root.$$phase; 
    if(phase == '$apply' || phase == '$digest') { 
     if(fn && (typeof(fn) === 'function')) { 
      fn(); 
     } 
    } else { 
     this.$apply(fn); 
    } 
}; 

quindi sarebbe qualcosa di simile:

$scope.safeApply(function() { ...code here... });

Problemi correlati