AngularJS - 为什么需要$ apply以正确解决$ q承诺?

时间:2013-02-07 07:59:24

标签: angularjs

我试图在我的角度应用程序中编写一个小服务,这将使我能够选择在全局Javascript对象中指定的配置参数。除非文档已准备就绪,否则我不想尝试访问全局配置对象(因为我无法保证在HTML中插入脚本元素的顺序)。

但是,我无法理解为什么我需要调用$apply才能使解析实际传播到then回调。

myModule.service('GlobalConfigService', ['$q', '$rootScope', function($q, $rootScope) {
    var def = $q.defer();
    $(document).ready(function() {
        def.resolve(MyConfig.val);
        $rootScope.$apply();
    });

    def.promise.then(function () {
        console.log('I am called only when $apply() is called. Why?');
    });

    return def.promise;
}]);

1 个答案:

答案 0 :(得分:31)

在AngularJS中,resolve()的结果在$ digest周期内异步传播,而不是立即传播。这意味着只有在摘要周期发生时才会调用(稍后)调用then()注册的回调。

在你的代码中,没有任何东西导致Angular进入摘要周期,因此从不调用then()回调。调用$ apply()是导致摘要周期运行的一种方法。另一种方法:添加一个没有任何操作的ng-click按钮,然后点击它,它将导致一个摘要周期,你应该看到结果:

<button ng-click="">Force digest by clicking me</button>

另见https://stackoverflow.com/a/14657974/215945

相关问题