我了解了无限摘要循环的基本概念以及它是如何发生的,但我遇到了问题。这是一个演示我的代码和问题的小提琴:
在 jsfiddle 控制台中,您将看到无限摘要循环。
基本上我必须对可能尚未加载的数据做出决定,所以我需要等待使用 then() 解决的承诺。我有一个叫做用户的承诺。代码中有两个不同的地方,我在用户上调用 then()。
- 就在我定义它之后。我需要根据它设置一个范围变量。
- 在另一个范围方法中,$scope.isAdmin()
对于第 2 点,可能会问为什么我不直接在 $scope.isAdmin() 方法中使用 $scope.user。问题是,有可能在用户的异步请求返回之前调用 $scope.isAdmin(),在这种情况下,我需要在从 $scope.isAdmin() 返回之前“阻止”。
我的问题是,$scope.isAdmin() 如何让 Angular 认为“监视”变量已更改并且摘要周期需要再次运行?
$scope.isAdmin() 实际上并没有改变任何东西。
这是精简的代码:
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>
和 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();
});