Ich bekomme die Grundidee der unendlichen Digest-Schleife und wie es passiert, aber ich bin auf das Problem. Hier ist eine Geige meinen Code und Problem demonstriert:
In der jsfiddle Konsole Sie die Endlosschleife verdauen sehen werden.
Grundsätzlich muss ich Entscheidungen über Daten treffen, die noch nicht geladen haben, also muss ich warten, bis das Versprechen mit then() aufgelöst wird. Ich habe ein Versprechen namens Benutzer. Es gibt zwei verschiedene Stellen im Code, an denen ich dann() an Benutzer rufe.
- Kurz nachdem ich es definiert habe. Ich muss eine Bereichsvariable basierend darauf festlegen. einfach nicht $ scope.user verwenden, um direkt in dem $ scope.isAdmin() -Methode
- In einer anderen Rahmen Methode $ scope.isAdmin()
Für die Nummer 2, könnte man sich fragen, warum ich. Das Problem ist, dass $ scope.isAdmin() aufgerufen werden kann, bevor die async-Anfrage für den Benutzer zurückkommt. In diesem Fall muss ich "blocken", bevor ich von $ scope.isAdmin() zurückkomme.
Meine Frage ist, was ist mit $ scope.isAdmin() macht Winkel denken, dass eine "beobachtete" Variable hat sich geändert und dass der Digest-Zyklus erneut ausgeführt werden muss?
$ scope.isAdmin() ändert nichts. Hier
ist die abgespeckte Code:
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>
Und die 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();
});
Vielen Dank für Ihre eigene Frage zu beantworten - dies die wirklich relevant Bit für mich war, was mich mein Problem verstehen: 'Aber in meinem Code, den ich war [...], die gerade ein neues Versprechen zurückgibt (das den Anwendungszyklus für immer fortsetzte, da sich der Rückgabewert ständig änderte) – keithl8041