如何在AngularJS上应用延迟

时间:2016-02-22 07:41:38

标签: javascript angularjs

我正在使用下面的代码,在laravel blade

<div ng-show="displayErrorMsg" class="form-group m-b alert alert-danger">{{errorMsg}}

在angularjs控制器中

$scope.errorMsg = "Data Empty";
$scope.displayErrorMsg = true;
setTimeout(function() { $scope.displayErrorMsg = false;}, 2000);

消息不会在给定后自动消失2秒。

但是当我简单地提出警告时(&#34; test&#34;);或点击任何地方消息消失。 如何解决这个问题?

8 个答案:

答案 0 :(得分:41)

只需在控制器中注入someprop并使用它。

$timeout

您也可以使用$ digest或$ apply

$timeout(function() { $scope.displayErrorMsg = false;}, 2000);

检查这些是如何工作的,

http://www.sitepoint.com/understanding-angulars-apply-digest/

答案 1 :(得分:7)

我通常需要一个功能,无论出于何种原因等待一点,仅用于测试目的。在Java中,我们可以使用Thread.sleep()。但是,在JavaScript中,我更喜欢使用我发现here的简单函数:

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

在一些场景中,它一直在为我工作,包括AngularJS。但是,请记住,除非您确切知道自己在做什么,否则不应在生产环境中使用该功能。

答案 2 :(得分:4)

示例1:setTimeout

var timerCount = function() {
    setTimeout(function () {
        $scope.displayErrorMsg = false;
        $scope.$apply(timerCount);
    }, 2000);
}

示例2:$ timeout

$timeout(function() { 
    $scope.displayErrorMsg = false;
}, 2000);

答案 3 :(得分:2)

尝试使用角度超时,以获得更多https://docs.angularjs.org/api/ng/service/$timeout

How to change value after delay by using angularjs?

$timeout(function() { $scope.displayErrorMsg = false;}, 2000);

答案 4 :(得分:2)

你可以注入$ timeout。 Angular的warapper window.setTimeout方法。

试试这个: -

$timeout(function() { $scope.displayErrorMsg = false;}, 2000);

$ timeout的结构是 synatx: - $超时(FN,延迟,invokeAny,通)

fn-你要延迟的功能

延迟: - 持续时间

invokeAny: - 默认情况下会设置为false,否则会在$ apply block中调用函数fn

传递: - 执行该功能是可选参数。

另一种方法: -

setTimeout(function () {
  $scope.$apply(function(){
      $scope.displayErrorMsg = false;
  });
}, 2000);

setTimeout方法用完了Angular Context所以我们需要调用$ apply来调用$ digest循环,因为如果我们在setTimeout中更新$ scope,Angular需要知道$ scope变脏了。

答案 5 :(得分:2)

改进的解决方案1:

$scope.errorMsg = "Data Empty";
$scope.displayErrorMsg = true;
if (timer) $timeout.cancel(timer); // restart counter
timer = setTimeout(function() { $scope.displayErrorMsg = false;}, 2000);

解决方案1:

您可以使用$timeout

$scope.errorMsg = "Data Empty";
$scope.displayErrorMsg = true;
setTimeout(function() { $scope.displayErrorMsg = false;}, 2000);

解决方案2:

使用setTimeout:

setTimeout(function () {
    $scope.$apply(function(){
        $scope.displayErrorMsg = false;
    });
}, 2000);

答案 6 :(得分:1)

setTimeout是window对象的方法。因此,为了访问此功能,在控制器中注入 $ window 。 然后你可以调用任何方法,如alert,confirm,setTimeout,setInterval等。
详情https://docs.angularjs.org/api/ng/service/$window
然后你可以写

$scope.errorMsg = "Data Empty";
$scope.displayErrorMsg = true;
$window.setTimeout(function() { $scope.displayErrorMsg = false;}, 2000);

答案 7 :(得分:0)

同步解决方案:

const sleep = ( ms ) => {
    const end = +(new Date()) + ms;
    while( +(new Date()) < end ){ } 
}

示例:

(function() {
    console.log(+(new Date())); // 1527837689811
    sleep(1000);

    console.log(+(new Date())); // 1527837690813
    sleep(2000);

    console.log(+(new Date())); // 1527837692814
    sleep(3000);

    console.log(+(new Date())); // 1527837695814
    sleep(4000);

    console.log(+(new Date())); // 1527837699814
    sleep(5000);
})();