1

我在旧的 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;
    });
4

0 回答 0