2014-09-10 69 views
-2

的setTimeout的我的代碼:如何使用具有角

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

我想在5秒後執行的函數,即顯示「你好」的消息。那麼,我的代碼是否正確?截至目前,該消息沒有顯示出來。我哪裏錯了?

+1

setTimeout看起來很好......你看到'.regErrMsg'文本消失了嗎?你希望改變$ scope的.errMsg屬性來做什麼?它似乎不會立即彈出一條消息?也許你應該在setTimeout之前和setTimeout回調中放置一個console.log,並觀察你的控制檯。這將幫助您確定問題出在哪裏。 – smerny 2014-09-10 15:32:04

+1

無論這個條件是什麼'if(xxx == xxx){'被認爲是因爲它看起來有點狡猾嗎?它是真實的代碼嗎? – Andy 2014-09-10 15:32:13

+0

是.... xxx - 我替換了我的條件。只要把它作爲一個真正的價值。 – 2014-09-10 15:33:12

回答

1

我的問題是,你好執行,然後等待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號線:
  8. ()調用巴茲baz被解釋
  9. 文件結束的......沒有任何反應了一會兒...
  10. 參數0(從5)被(從4使用引用)調用
  11. bar得到解釋
  12. ()調用bar

截至目前,該消息沒有顯示出來。我哪裏錯了?

看起來將在DOM反映您所做的唯一的變化是從.regErrMsg文本的清理,也許你想用

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

或調用其他方法這將使$scope的更新價值反映在#文檔

2

在控制器中使用setTimeout的「問題」是角度不會在調用setTimeout中的函數之後觀察範圍的內容。

解決方案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); 

你應該注入$超時到控制器中

我已刪除了$('.regErrMsg').text("");,因爲你不應該改變一個控制器內部的DOM。