javascript - 如何将一个范围内的延迟对象集包含在 AngularJS 中另一个范围的摘要中?

标签 javascript scope angularjs digest deferred

各位,我有一个问题。我正在使用 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;
});

该服务在我的 Controller 中使用:

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

最后 View 等待 Promise 得到解决然后显示它:

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

问题在于,虽然 promise 正在得到解决,并且 View 在等待 promise 得到解决并显示结果方面做得很好,但它不会立即执行。仅当我添加此代码并单击链接时它才会显示:

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

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

promise 所在的摘要部分是否与 View / Controller 范围更改时运行的摘要分开存在?当延迟解析时,如何让摘要在 View / Controller 的作用域上自动运行?

谢谢!

最佳答案

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

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

关于javascript - 如何将一个范围内的延迟对象集包含在 AngularJS 中另一个范围的摘要中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500051/

相关文章:

c++ - 解决此范围问题的最佳方法是什么?

c++ - 这段c++代码是怎么回事? (继承的解析运算符?!?)

javascript - 双向绑定(bind)在 ES6 中不起作用

javascript - knockout 可观察字段不会在输入值更改时更新

javascript - PHP 不向 ajax 调用返回数据

javascript - Nginx 和 Node.js 服务器 - 多个任务

javascript - 使用 LoDash 和 ParseDB 进行 JSON CRUD 操作

scope - 如何在 VB .NET 中解决此范围问题?

javascript - 为什么 New Date() 总是返回 null?

javascript - AngularJS:在链接方法中添加指令的范围