2017-01-02 73 views
1

我有一個數組如下:角NG-重複不更新陣列

[7500, 15000, 21300, 3600] 

這個陣列被印刷在使用ng-repeat視圖。但我的問題是,我正在使用setInterval每秒更新這個數組,它被觸發,並在控制器上工作,但更新的值不會顯示在視圖中。我的代碼如下:

的JavaScript

angular 
    .module('controllers') 
    .controller('DashCtrl', DashCtrl); 

function DashCtrl($scope, $window) { 

    var dash = this; 
    dash.alarmList = JSON.parse() ; // [7500, 15000, 21300, 3600] 

    dash.updateClock = function() { 
     for(var key in dash.alarmList) { 
      dash.alarmList[key] --; 
     } 
    } 

    setInterval(dash.updateClock, 1000); 
} 

HTML

<div class="list"> 

    <a class="item item-icon-left" ng-repeat="alarm in dash.alarmList"> 
    <i class="icon ion-person-stalker"></i> 
    {{alarm}} 
    <span class="badge badge-assertive">0</span> 
    </a> 

</div> 
+0

對於alarmlist值的預期更新是什麼?你是否意味着每秒都會從鬧鐘中減掉1,就像倒計時一樣? –

回答

3

您應該使用$interval代替setInterval這將在內部調用$scope.apply()更新綁定。

angular 
    .module('controllers') 
    .controller('DashCtrl', DashCtrl); 

function DashCtrl($scope, $window, $interval) { 

    var dash = this; 
    dash.alarmList = JSON.parse() ; // [7500, 15000, 21300, 3600] 

    dash.updateClock = function() { 
     for(var key in dash.alarmList) { 
      dash.alarmList[key] --; 
     } 
    } 

    $interval(dash.updateClock, 1000); 
} 

注意:使用此服務創建的間隔必須在完成時明確銷燬。

1

角的包裝器window.setInterval。每延遲毫秒執行一次fn函數 。

註冊間隔函數的返回值是一個承諾。 該承諾將在每個時間間隔的時間間隔被通知,並且 將在計數迭代後解決,或者如果計數未定義爲 則無限期運行。通知的值將是已運行的 迭代的數量。要取消間隔,請撥打 $ interval.cancel(承諾)。

在測試中,您可以使用$ interval.flush(millis)以毫秒爲單位前進 毫秒並觸發計劃在此期間運行的任何函數。

注意:由此服務創建的間隔必須在完成後明確銷燬 。特別是當銷燬控制器的作用域或指令的 元素時,它們不會自動銷燬。您應該考慮到這一點,並確保在適當的時候始終取消間隔。有關如何以及何時執行此操作的更多詳細信息,請參閱下面的示例 。

你必須使用$間隔

$interval(function(){dash.updateClock}, 1000); 
1

在您的情況下,Angular不會收到通知,該值已更改且摘要循環未運行。一些角度指令/服務(ng-click, $timeout, $interval, etc.)自動觸發摘要循環。因此,要麼使用$ interval而不是setInterval,要麼通過將您的for循環包入內部來手動觸發摘要循環$scope.$apply(() => { /* your code here */ });

0

您的代碼似乎存在一些邏輯缺陷。請嘗試以下操作:

<script>function DashCtrl() { 

    var dash = this; 
    var alarmlist = { 
     0: 7500, 
     1: 1500, 
     2: 21300, 
     3: 3600 
     }; 

     dash.alarmList = alarmlist; 


    dash.updateClock = function() { 
     for(var i in dash.alarmList) { 
      dash.alarmList[i] -= 1; 
     } 
     console.log(dash.alarmList); 
    } 

    setInterval(dash.updateClock, 1000); 
} 
DashCtrl(); 
</script> 

我假設您在角度的情況下也需要$ interval包裝。