2

各位,我有问题。我正在使用 AngularJS,并且在 Angular 服务定义中设置了一个延迟对象:

angular.module('myServices', []).
  service('Brand', function($rootScope, $q){
    var service = {
        getNext: function() {
            var deferred = $q.defer();

            setTimeout(function() {
                deferred.resolve('foo');
            }, 2000);

            return deferred.promise;
        }
    };

    return service;
});

该服务在我的控制器中使用:

angular.module({
    controllers: {
        brand: function($scope, Brand) {
            $scope.changeBrand = function() {
                $scope.brand = Brand.getNext();
            }
        }
    }
}, ['myServices]);

最后,视图等待 promise 被解决,然后显示它:

<a ng-click="changeBrand()" id="changeBrand">Change</a>
<p ng-bind="brand"></p>

问题在于,虽然 promise 正在解决,并且视图在等待 promise 被解决并显示结果时做得很好,但它并没有立即执行。它仅在我添加此代码并单击链接时显示:

// View:
<a ng-click="apply()">Apply</a> 

// Controller:
$scope.apply = function() {
    $scope.$apply();
};

承诺所在的摘要部分是否与视图/控制器范围更改时运行的摘要分开存在?当延迟解决时,如何让摘要自动在视图/控制器的范围内运行?

谢谢!

4

1 回答 1

5

几天前,我在使用 Promise 实现惰性控制器时遇到了同样的问题。当您查看有关 routeProvider 的文档时,有一个示例使用带有承诺的 $timeout 服务(https://github.com/angular/angular.js/blob/master/src/ng/route.js#L186) . $timeout 实现使用 $rootScope.$apply() 来调用生命周期并刷新绑定(AFAIK 它调用所有脏检查函数——这就是绑定在 Angular 中的工作方式)。所以解决我的问题(我认为也是你的问题)的解决方案是在 resolve() 之后添加 $rootScope.$apply(),如下所示:

 setTimeout(function() {
            deferred.resolve('foo');
            $rootScope.$apply();
        }, 2000);
于 2012-11-21T19:19:17.577 回答