2013-10-10 27 views
0

由於過去幾個月,我一直在做很多JS,但我從來沒有真正學會了它在大學/一本書等查詢有關的setTimeout()

這裏有一個問題:

$scope.selectTab = function($index, tab) { 
    $scope.template = $scope.templates[$index]; 
    $scope.data.tabSelected = tab; 
    setTimeout(function() { 
     console.clear(); 
     console.log($scope.template); 
     console.log(document.getElementById("SomeDiv")) 
     console.log("Going to draw now...") 
     draw_analytics($scope); // Draw on SomeDiv 
    }, 0); 
} 

while the above code works;但下面的一個沒有。

$scope.selectTab = function($index, tab) { 
    $scope.template = $scope.templates[$index]; 
    $scope.data.tabSelected = tab; 
    console.clear(); 
    console.log($scope.template); 
    console.log(document.getElementById("SomeDiv")) 
    console.log("Going to draw now...") 
    draw_analytics($scope); 
} 

我使用一些黏合事情AngularJS,但這並不影響我猜。 在最上面的代碼中,當我嘗試獲取SomeDiv dom時,我實際上得到它的HTML內容,而在底部代碼中,返回null

+2

你是什麼意思'fsb'?該代碼沒有任何內容。 – Lloyd

+3

'不起作用'是什麼意思?如果有任何錯誤,請在這裏發佈 – k102

+0

對不起,我的意思是'SomeDiv'。那麼如果底層代碼'SomeDiv'是'null'(儘管它不應該是'$ scope.template = $ scope.templates [$ index];'將正確的HTML賦值給它)。在頂級代碼中,它會很好。 –

回答

1

當您將settimeout與匿名函數一起使用時,它不會立即執行它。它將其添加到當前事件結束後執行的隊列中。

這與在沒有settimeout的情況下運行它相反,它只是立即執行它。

如果我不得不猜測,「SomeDiv」正在創建或操作與選項卡更改。因此,馬上運行代碼可能會導致在實際創建div之前代碼執行的情況。雖然調用「settimeout」將在執行前等待當前事件完成。儘管看起來它與事件內聯,但實際上只是安排匿名函數在最後運行。

我創建了一個小提琴來說明我在說什麼。 http://jsfiddle.net/pS54r/

使用settimeout的第一個按鈕,第二個按鈕沒有。

$('#clickme').click(function() { 
    WriteToDiv('First Button 1'); 
    setTimeout(function() { 
     WriteToDiv('First Button 2'); 
    }, 0); 
    WriteToDiv('First Button 3'); 
}); 

$('#clickme2').click(function() { 
    WriteToDiv('Second Button 1'); 
    WriteToDiv('Second Button 2'); 
    WriteToDiv('Second Button 3'); 
}); 
+0

啊,非常感謝,我現在得到它。有沒有更好的方法來添加父函數完成後執行的函數?就像我仍然想稱之爲「draw_analytics($ scope);」剛創建「SomeDiv」之後。 –

+0

據我所知,你擁有它的第一種方式是讓它工作並使其易於維護的最佳方式。雖然我不是專家,所以可能有些事情我不知道。 – Smeegs