1

我可能有不同的頁面應用程序有自己的控制器。其中一個有$ interval函數,比如說一個計時器。點擊一個按鈕將啓動這個間隔功能,每秒更新一次。我想有是的,我希望能夠去任何其他網頁在我的應用程序(調用不同的控制器),但我希望我的區間繼續運行,直到我從第一控制器明確停止它。 A rootScope間隔可以這麼說。我該怎麼做?

編輯:感謝Chris和Patrick我現在有一個簡單的服務,看起來是這樣的:

.service('TimerService', function($interval) { 
    var promise; 
    var timerSeconds = 0; 

    this.start = function() { 
     promise = $interval(function() { 
     timerSeconds++; 
     }, 1000); 
    }; 

    this.stop = function() { 
     promise.cancel(interval); 
     timerSeconds = 0; 
    }; 

    this.getTimer = function() { 
     return timerSeconds; 
    } 
    }) 

我也存儲在這個服務我的電流值(timerSeconds)。但是,我怎樣才能將這個值同步到我的控制器?該服務增加了timerSeconds,並且在我的控制器開始處,我通過它的getTimer()函數從該服務中讀取它,但它顯然不會在我的控制器上更新。 如何將此服務屬性與我的本地屬性同步?

編輯:

當我定義我的服務屬性爲對象和timerSeconds爲對象的內部編號(好像原語無法同步):

var timer = {seconds : 0}; 

this.getTimer = function() { 
    return timer; 
} 

,並從中獲取該對象我控制器通過該吸氣劑:

vm.timer = TimerService.getTimer(); 

它們全部同步。

回答

2

不要麻煩將它添加到$ rootScope。使用可在應用程序的任何位置使用的服務。這是一個可以啓動和停止的單身計時器。在服務本身中定義intervalTimeout,或者如果你想變得非常靈活,那麼在提供者中這樣做(這個例子可能是矯枉過正)。

angular.module('myApp', []) 
 

 
.service('AppCallback', function ($interval) { 
 
    var states = states = { 
 
     PENDING: 0, 
 
     STARTED: 1 
 
    }, intervalTimeout = 3000, // Set this 
 
    interval; 
 

 
    this.states = states; 
 
    
 
    this.state = states.PENDING; 
 
    this.start = function (callback) { 
 
     if (this.state !== states.PENDING) { 
 
      return; 
 
     } 
 

 
     interval = $interval(callback, intervalTimeout); 
 
     this.state = states.STARTED; 
 
    } 
 

 
    this.stop = function() { 
 
     if (this.state !== states.STARTED) { 
 
      return; 
 
     } 
 
     $interval.cancel(interval); 
 
     this.state = states.PENDING; 
 
    }; 
 
}) 
 

 
.controller('MainController', function ($scope, AppCallback) { 
 
    var vm = {}, 
 
     count = 0; 
 
    
 
    vm.toggle = function toggle() { 
 
    if (AppCallback.state === AppCallback.states.PENDING) { 
 
     AppCallback.start(function() { 
 
     vm.data = 'Ticked ' + (++count) + ' times.'; 
 
     }); 
 
    } else { 
 
     AppCallback.stop(); 
 
    } 
 
    }; 
 
    
 
    
 
    $scope.vm = vm; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp" ng-controller="MainController"> 
 
    {{vm.data}} 
 
    <br /> 
 
    <button ng-click="vm.toggle()">Toggle</button> 
 
</div>

+0

所以在服務運行在您的控制器更新此數據對象之間共享一些信息,但如果你改變你的控制器,並調用它會發生什麼再次?您的數據和計數對象將會丟失,因爲它們是在您的控制器中定義的。 。或者我想念某事? – akcasoy

+0

我試圖將數據對象添加到rootScope並從那裏讀取它。它有點作用,但它總是不那麼好同步vm和rootScope你有任何其他的建議嗎? – akcasoy

2

如果你想分享控制器之間的任何數據的正確方法是使用服務。

然後我會創建一個服務,它允許你停止和啓動該定時器/間隔。

最初的控制器會踢這個功能,它將繼續「嘀」永遠,直到它停止。

+0

而要我把我的計時器對象rootScope(這將永遠間隔遞增數)? – akcasoy

+0

使用工廠來存儲該號碼。 – Rorschach120

+0

是的,正如@ Rorschach120建議提出,在您的服務/工廠,因爲這是你想要的控制器 – Chris