2014-10-30 105 views
0

在下面的控制器$ scope.timer每秒增加,但在視圖{{timer}}不反映它的內容。

myapp.controller('TimeCtrl', ['$scope', function($scope){ 
    $scope.timer = 0; 
    setInterval(function(){ 
     $scope.timer = $scope.timer + 1; 
     console.log($scope.timer); 
    },1000); 
}]); 

我可以解決它在計時器更新後添加$scope.$apply();爲什麼?爲什麼計時器不更新?

小提琴這裏:http://jsfiddle.net/wvxgzx76/1/

+0

使用'$ interval'代替。 – 2014-10-30 16:18:27

+0

謝謝你是對的,但爲什麼呢? – 2014-10-30 16:19:17

回答

1

因爲setInterval$digest週期之外 - 使用Angulars $interval指令代替:

myapp.controller('TimeCtrl', ['$scope', '$interval', function($scope, $interval){ 
    $scope.timer = 0; 
    $interval(function(){ 
     $scope.timer = $scope.timer + 1; 
     console.log($scope.timer); 
    },1000); 
}]); 
1

只是包裝你的代碼範圍適用於:

var myapp = angular.module('myapp', []); 
myapp.controller('TimeCtrl', ['$scope', function($scope){ 
    $scope.timer = 0; 
    setInterval(function(){ 
     $scope.$apply(function() { 
      $scope.timer = $scope.timer + 1; 
      console.log($scope.timer); 
     }); 
    },1000); 
}]); 

或使用$ interval而不是setInterval(我更喜歡這個):

var myapp = angular.module('myapp', []); 
myapp.controller('TimeCtrl', ['$scope', '$interval', function($scope,$interval){ 
    $scope.timer = 0; 
    $interval(function(){  
     $scope.timer = $scope.timer + 1; 
     console.log($scope.timer); 
    },1000); 
}]); 

http://jsfiddle.net/wvxgzx76/3/