我有一个控制器,我需要使用 ajax 加载内容。在加载时,我希望在此期间出现一个微调器。代码如下所示:
<i class="fa fa-2x fa-spin fa-spinner" ng-show="isLoadingContent"></i>
以及对应的js:
$scope.isLoadingContent = true;
$q.all(promises).then(function (values) {
$scope.isLoadingContent = false;
// more code - display returned data
但是,当我单步执行代码时,微调器的 UI 不会出现在我期望它出现的位置/时间。
$scope.isLoadingContent = true;
debugger; // the spinner does not appear on the UI
$q.all(promises).then(function (values) {
debugger; // the spinner finally does appear in the UI at this point
$scope.isLoadingContent = false;
// more code - display returned data
我曾尝试单步执行代码,但对正在发生的事情一无所知——而且我确信我误解了事件循环中发生的事件顺序以及角循环在所有这些中的作用。
是否有人能够解释为什么将微调器设置为出现在承诺的方法中而不是我设置的位置$scope.isLoadingContent
?它实际上并没有被设置,而是在事件循环的消息队列中排队?
- - - - - - 编辑 - - - - - -
我相信我遇到了关于发生了什么的解释。很大程度上要感谢@jcford 和@istrupin。
所以原始帖子中缺少一点花絮,触发承诺调用的事件和微调器更新实际上是基于一个$scope.$on("some-name", function(){...})
事件 - 实际上是在我当前控制器范围之外触发的点击事件。我相信这意味着 $digest 循环不像通常那样工作,因为事件起源是在哪里触发的。因此,函数中的任何更新$on
都不会像通常那样调用 $apply/$digest,这意味着我必须专门进行 $digest 调用。
奇怪的是,我现在意识到在 中$q.all()
,它必须调用$apply
,因为在调试时,我看到了我所期望的 DOM 更改。嗯。
tl;博士-打电话$digest
。