2015-04-19 100 views
0

正確的方法是定期更新元素,而不是爲$ interval回調中的每個變量顯式地執行該操作?如何使用Angular更新綁定到函數的元素?

這將在以下情況下有用:元件的內容被綁定到一個函數,如下所示:

<p ng-bind="timeLeft()"></p> 

的的timeleft()函數返回根據當前時間的值。它需要每20毫秒刷新一次。

編輯:通常ngBind更新很好,但我猜是因爲timeLeft()的結果只取決於時間傳遞,在這種情況下,它不。沒有下面的代碼,加載DOM後視圖不會更新,至少不會更新其他值。

我試過以下,它的工作原理:

$scope.updateView = function(){ 
    if(!$scope.$$phase) { // To prevent this: "Error: [$rootScope:inprog] $digest already in progress" 
     $scope.apply(); 
    } 
} 
$interval(function(){ 
    $scope.updateView(); 
}, 50); 

我注意到剛纔使用$間隔可能已經足夠了,在我的設置這個工程太:

$scope.updateView = function(){ 
} 
$interval(function(){ 
    $scope.updateView(); 
}, 20); 

難道是可靠的使用最後的解決方案?

+0

角JS提供了原生一個驚人的'bind'(無碼)。我不確定爲什麼要用某種計時器刷新。我想我不明白,你可能有很好的理由。 – MacKentoch

+1

最後的解決方案很好。沒有必要調用$ apply,除非該方法將在angularjs之外被調用(即jQuery事件) – pixelbits

回答

1

是的,你應該可靠的第二種解決方案。 當事件從外部角度上下文發生時,角度不會運行摘要循環,因爲您需要告訴AngularJs運行應用循環來更新所有綁定。在使用$interval時,角將在執行回調函數後運行摘要循環,因此無需運行第1個解決方案中完成的摘要循環。

你需要看$interval服務

$interval($scope.updateView, 
    20, //delay 
    10, //this option will run it 10 times, if not specified then infinite times 
    true, //do you want to run digest cycle after callback execution, defaulted to true 
    {} //any extra params 
); 
相關問題