如何使用带角度的setTimeout

时间:2014-09-10 15:29:50

标签: javascript angularjs

我有代码:

if (xxx == xxx){
    var x = 5 + 3;
    setTimeout(function() { 
        $('.regErrMsg').text("");
        $scope.errMsg = "Hi.";
    }, 5000);
}

我想执行这个功能,即显示"嗨" 5秒后发出消息。那么,我的代码是否正确。截至目前,该消息未显示。我哪里出错?

2 个答案:

答案 0 :(得分:2)

控制器内setTimeout的“问题”是在调用setTimeout中的函数后,angular不会观察范围的内容。

解决方案1 ​​

您可以执行$scope.$apply()强制视图更新,例如:

setTimeout(function() { 
    $scope.errMsg = "Hi.";
    $scope.$apply();
}, 5000);

解决方案2

它们是一个特殊函数$timeout,它将在调用函数后自动触发视图刷新。它与setTimeout具有相同的签名。

$timeout(function() { 
    $scope.errMsg = "Hi.";
    //You don't need $scope.$apply() here
}, 5000);

您应该在控制器中注入$ timeout

我删除了$('.regErrMsg').text("");,因为你不应该更改控制器内的dom。

答案 1 :(得分:1)

  

我的问题是...... Hi执行然后等待5秒或等待5秒然后显示嗨?

让我们考虑一个简化的例子

foo();
setTimeout(function () {bar();}, 5000);
baz();

现在可以更加容易地描述将要发生的事情,一步一步(令人难以忍受的细节)

  1. 第1行: foo获得解释
  2. ()调用foo
  3. 第2行: setTimeout获得解释
  4. 解释传递给setTimeout的参数,即此处设置的函数引用
  5. (/* ... */)调用setTimeout
  6. setTimeout设置回调以在参数0 毫秒之后调用参数1
  7. 第3行: baz获得解释
  8. ()调用baz
  9. 文件结尾 ......暂时没有任何反应......
  10. 参数0 (来自5)被调用
  11. bar被解释(使用4的引用)
  12. ()调用bar

  13.   

    截至目前,该消息未显示。我哪里出错?

    看来你所做的唯一改变将反映在 DOM 中的是.regErrMsg中的文字清除,也许你打算使用

    $('.regErrMsg').text("Hi.");
    

    或调用其他一些方法,使$scope的更新值反映在 #document