Ricevo l'idea di base del ciclo infinito del digest e di come accade, ma mi sto imbattendo nel problema. Ecco un violino che dimostra il mio codice e problema:
Nella console jsfiddle vedrete il digerire ciclo infinito.
Fondamentalmente devo prendere decisioni sui dati che potrebbero non essere ancora stati caricati, quindi devo aspettare che la promessa risolva usando(). Ho una promessa chiamata utente. Ci sono due posti diversi nel codice dove chiamo quindi() sull'utente.
- Subito dopo averlo definito. Devo impostare una variabile scope in base ad essa.
- In un altro metodo di applicazione, $ scope.isAdmin()
Per il numero 2, potrebbe essere chiesto perché io non uso $ scope.user direttamente nel metodo $ scope.isAdmin(). Il problema è che è possibile chiamare $ scope.isAdmin() prima che la richiesta asincrona per l'utente ritorni, nel qual caso devo "bloccare" prima di tornare da $ scope.isAdmin().
La mia domanda è, che dire $ scope.isAdmin() sta facendo angolare pensare che una variabile 'guardata' è cambiata e che il ciclo di digest deve essere eseguito di nuovo?
$ scope.isAdmin() in realtà non modifica nulla.
ecco il codice ridotta:
HTML:
<body ng-controller='myController'>
<div ng-if='isAdmin()'>Hi! <strong>{{ user.username }}</strong> is an Admin!!!</div>
<div ng-if='!isAdmin()'>Hi! <strong>{{ user.username }}</strong> is NOT an Admin!!!</div>
</body>
E il JS:
angular.module('myApp', [])
.factory('myService', function($q, $timeout) {
return {
getUser: function() {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve({ username: 'me', isAdmin: true });
}, 2000);
return deferred.promise;
}
};
})
.controller('myController', function($scope, $q, myService) {
var getUserDeferred = $q.defer();
var user = getUserDeferred.promise;
user.then(function(user) {
$scope.user = user;
return user;
});
$scope.getUser = function() {
return myService.getUser().then(function(user) {
getUserDeferred.resolve(user);
});
};
$scope.isAdmin = function() {
return user.then(function(user) {
return user.isAdmin;
});
};
$scope.getUser();
});
grazie per la risposta alla tua domanda - questo era il bit veramente rilevante per me, che mi ha fatto capire il mio problema: 'Ma nel mio codice ho era [...] che restituisce appena una nuova promessa (che ha mantenuto il ciclo di applicazione in corso per sempre dal momento che il valore di ritorno continuava a cambiare) ' – keithl8041