我在旧的 Angular 1.5.9 代码库上使用 angular-busy(是的,是的,我们很快就会迁移,...)
我正在使用它来执行“检查更新...”覆盖,并且我希望显示繁忙的消息,所以我设置 delay=0, minDuration=1500 只是为了让它看起来不会闪烁。更新通常需要 < 200 毫秒。
作为更新的一部分,我的 $uibModal 对话框中的内容会更新,我正在使用 ng-show 隐藏它,直到我的电话返回。那部分效果很好。但是因为我使用的是 cg-busy 的 minDuration,所以内容会在 cg-busy 的覆盖层离开之前显示——这是我不想要的。
cg-busy 知道它什么时候是活跃的,什么时候不活跃。在内部,它为它的跟踪器类使用了一个子作用域,该跟踪器类有一个名为 $cgBusyIsActive() 的方法,它用于它自己的 ng-show。如果我可以访问它会很棒,但是在研究了一下之后,唉,我找不到找到它的方法(而且可能我什至不应该)。
问题 1:有谁知道检测 cg-busy 何时处于活动状态并将其用于 ng-show 或 ng-hide 的方法?
这是一个显示我想要的快速片段:
<div cg-busy="$ctrl.updatesBusy">
<div ng-show="!$cgBusyIsActive() && $ctrl.updateResult.done">
...
</div>
</div>
问题 2:或者是否有更好/不同的方法来完成我的解决方法,即强制承诺链具有 minDuration?
目前为了解决这个问题,我只是创建了自己的计时器并在我的承诺链中设置了一个超时,如果在 minDuration 中还有任何时间,它就会触发,但我喜欢使用 cg-busy 的 minDuration 的解决方案。
const cgTimerStarted = Date.now();
$ctrl.updatesBusy.promise = myUpdateCallAsync()
.then(function(result) {
// blah blah, blah blah
return $q.resolve(); // return a promise obj or cg-busy will go away
})
.catch(function(err) {
// boo hoo, boo hoo
return $q.resolve(); // return a promise obj or cg-busy will go away
})
.then(function() {
const minDuration = $ctrl.updatesBusy.minDuration;
const timeTaken = Date.now() - cgTimerStarted;
const timeLeft = Math.max(minDuration - timeTaken, 0);
return $timeout(timeLeft);
})
.finally(function() {
$ctrl.updatesResult.done = true;
});