我有代码:
if (xxx == xxx){
var x = 5 + 3;
setTimeout(function() {
$('.regErrMsg').text("");
$scope.errMsg = "Hi.";
}, 5000);
}
我想执行这个功能,即显示"嗨" 5秒后发出消息。那么,我的代码是否正确。截至目前,该消息未显示。我哪里出错?
答案 0 :(得分:2)
控制器内setTimeout的“问题”是在调用setTimeout中的函数后,angular不会观察范围的内容。
您可以执行$scope.$apply()
强制视图更新,例如:
setTimeout(function() {
$scope.errMsg = "Hi.";
$scope.$apply();
}, 5000);
它们是一个特殊函数$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();
现在可以更加容易地描述将要发生的事情,一步一步(令人难以忍受的细节)
foo
获得解释()
调用foo
setTimeout
获得解释setTimeout
的参数,即此处设置的函数引用(/* ... */)
调用setTimeout
setTimeout
设置回调以在参数0
毫秒之后调用参数1
baz
获得解释()
调用baz 0
(来自5
)被调用bar
被解释(使用4
的引用)()
调用bar
截至目前,该消息未显示。我哪里出错?
看来你所做的唯一改变将反映在 DOM 中的是.regErrMsg
中的文字清除,也许你打算使用
$('.regErrMsg').text("Hi.");
或调用其他一些方法,使$scope
的更新值反映在 #document