我正在尝试在我的角度应用程序中编写一个小型服务,这将使我能够选择在全局Javascript对象中指定的配置参数。除非文档准备好,否则我不想尝试访问全局配置对象(因为我不能保证脚本元素在HTML中的插入顺序)。
但是,我不明白为什么我需要调用才能$apply使分辨率实际传播到then回调。
$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; }]);
在AngularJS中,resolve()的结果在$digest周期内异步传播,而不是立即传播。这意味着仅在摘要循环发生时才调用(随后)向then()注册的回调。
在您的代码中,没有什么会导致Angular进入摘要循环,因此永远不会调用then()回调。调用$apply()是导致摘要循环运行的一种方法。另一种方法:使用ng-click添加一个不执行任何操作的按钮,然后单击该按钮,这将导致摘要循环,您应该看到结果:
<button ng-click="">Force digest by clicking me</button>